相同点:
- 都不能实例化
- 都可以定义抽象方法
- 都可以定义成员方法,接口中成员方法要用default修饰(JDK 8后)
- 都可以定义静态方法,但接口中的静态方法只能通过接口访问,无法通过实现类访问
不同点:
- 继承:抽象类只能继承自一个抽象类,接口可以extends多个接口
- 代码块:抽象类中可以定义构造/静态代码块,接口中不能
- 成员变量:抽象类中可以定义普通成员变量;接口中定义的变量是默认用public static final修饰的(无论有没有显示指定),且必须初始化
- 方法权限:抽象类中的变量和方法可以用任意权限符修饰,接口中的的变量和方法默认为public
- 被继承:每一个类只能继承一个抽象类,但可以实现多个接口
- 抽象区别:最大的区别还是抽象意义上的区别。从抽象的角度来说,抽象类一般为一个父类 表示一个类别的基础。而接口通常表示功能的拓展,或者一类对象的实现规范,比如lock接口
案例对比:
/**
* 抽象类测试
*/
public abstract class AbstractTest extends Abtract1 {
//不同点:抽象类只能继承自一个抽象类,接口可以extends多个接口
//不同点:抽象类中可以定义普通成员变量
private int a;
//不同点:抽象类中可以定义构造/静态代码块
static {
System.out.println("我被加载了");
}
{System.out.println("构造子类对象啦"); }
//可以定义抽象方法,可用public和protected修饰
protected abstract void hello();
//可以定义成员方法和静态方法
private void hello2(String s) {
System.out.println(s);
}
public static void hello3(String s) {
System.out.println("hello3:" + s);
}
}
/**
* 接口测试
*/
public interface InterfaceTest extends Interface1, Interface2 {
//不同点:抽象类只能继承自一个抽象类,接口可以extends多个接口
//不同点:接口中定义的变量是默认用public static final修饰的(无论有没有显示指定),且必须初始化
public static final int a = 1;
int b = 2;
//可以定义抽象方法,但接口的所有方法默认为public
public abstract void hello();
public void hello1();
//可以定义成员方法,但要用default修饰
default public void hello2(String s) {
hello3("hello2:" + s);
}
//可以定义静态方法,但是只能通过InterfaceTest访问,无法通过实现类访问
public static void hello3(String s) {
System.out.println("hello3:" + s);
}
}