抽象类和接口有什么区别?

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)

  • HerrFang 永久会员 2022-07-21 11:51 下午

    接口不能有protected修饰的方法吧

  • mpweixin用户 普通 2022-03-16 3:31 下午

    共同点 :

    都不能被实例化。
    都可以包含抽象方法。
    都可以有默认实现的方法(Java 8 可以用 default 关键在接口中定义默认方法)。
    区别 :

    接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系(比如说我们抽象了一个发送短信的抽象类,)。
    一个类只能继承一个类,但是可以实现多个接口。
    接口中的成员变量只能是 public static final 类型的,不能被修改且必须有初始值,而抽象类的成员变量默认 default,可在子类中被重新定义,也可被重新赋值。

  • kite 普通 2021-06-27 1:03 上午

    抽象类:
    1可以定义构造方法
    2成员属性可使用任意修饰符修饰
    3成员方法可使用public(默认)、default、protected、static修饰(不能与abstract同用)
    4类名使用abstract修饰

    接口:
    1无构造方法
    2成员属性一律使用private static final修饰
    3成员方法一律使用public abstract修饰
    4类名使用interface修饰
    新特性
    java8开始接口可default修饰符定义默认方法和定义static修饰的静态方法
    java9开始接口可定义私有方法

  • kite 普通 2021-06-27 12:58 上午

    抽象类:
    1可以定义构造方法
    2成员属性可使用任意修饰符修饰
    3成员方法可使用public(默认)、default、protected修饰
    4类名使用abstract修饰

    接口:
    1无构造方法
    2成员属性一律使用private static final修饰
    3成员方法一律使用public abstract修饰
    4类名使用interface修饰
    新特性
    java8开始接口可default修饰符定义默认方法和定义static修饰的静态方法
    java9开始接口可定义私有方法