抽象类和接口有什么区别?
1)抽象类中可以定义构造函数,接口不能定义构造函数;
(2)抽象类中可以有抽象方法和具体方法,而接口中只能有抽象方法(public abstract);
(3)抽象类中的成员权限可以是 public、默认、protected(抽象类中抽象方法就是为了重写,所以不能被 private 修饰),而接口中的成员只可以是 public(方法默认:public abstrat、成员变量默认:public static final);
(4)抽象类中可以包含静态方法,而接口中不可以包含静态方法;
JDK 8 中的改变:
1、在 JDK1.8中,允许在接口中包含带有具体实现的方法,使用 default 修饰,这类方法就是默认方法。
2、抽象类中可以包含静态方法,在 JDK1.8 之前接口中不能包含静态方法,JDK1.8 以后可以包含。之前不能包含是因为,接口不可以实现方法,只可以定义方法,所以不能使用静态方法(因为静态方法必须实现)。现在可以包含了,只能直接用接口调用静态方法。JDK1.8 仍然不可以包含静态代码块。
评论(7)
接口不能有protected修饰的方法吧
共同点 :
都不能被实例化。
都可以包含抽象方法。
都可以有默认实现的方法(Java 8 可以用 default 关键在接口中定义默认方法)。
区别 :
接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系(比如说我们抽象了一个发送短信的抽象类,)。
一个类只能继承一个类,但是可以实现多个接口。
接口中的成员变量只能是 public static final 类型的,不能被修改且必须有初始值,而抽象类的成员变量默认 default,可在子类中被重新定义,也可被重新赋值。
抽象类:
1可以定义构造方法
2成员属性可使用任意修饰符修饰
3成员方法可使用public(默认)、default、protected、static修饰(不能与abstract同用)
4类名使用abstract修饰
接口:
1无构造方法
2成员属性一律使用private static final修饰
3成员方法一律使用public abstract修饰
4类名使用interface修饰
新特性
java8开始接口可default修饰符定义默认方法和定义static修饰的静态方法
java9开始接口可定义私有方法
“2成员属性一律使用private static final修饰”,上文中说是 public 的,这里就说是 private,所以请问最终是哪一个?
不要误人子弟,接口属性修饰符不能是private
接口访问权限一律是public
抽象类:
1可以定义构造方法
2成员属性可使用任意修饰符修饰
3成员方法可使用public(默认)、default、protected修饰
4类名使用abstract修饰
接口:
1无构造方法
2成员属性一律使用private static final修饰
3成员方法一律使用public abstract修饰
4类名使用interface修饰
新特性
java8开始接口可default修饰符定义默认方法和定义static修饰的静态方法
java9开始接口可定义私有方法