接口和抽象类的区别

接口是对动作的抽象

1. 接口中最重要的就是抽象方法,格式:[public] [abstract] 返回值类型 方法名称(参数列表);

注意:实现类必须覆盖重写接口所有的抽象方法,除非实现类是抽象类。

         接口当中的抽象方法,修饰符必须是两个固定的关键字:public abstract,这两个关键字修饰符可以选择性地省略。

2. 从 Java 8 开始,接口允许定义默认方法,格式:[public] default 返回值类型 方法名称(参数列表) {方法体}

注意:默认方法也可以被覆盖重写。

3. 从 Java 8 开始,接口里允许定义静态方法,格式:[public] static 返回值类型 方法名称(参数列表) {方法体}

注意:应该通过接口名称进行调用,不能通过实现类对象调用接口静态方法。

4. 从 Java 9 开始,接口里允许定义私有方法,格式:

普通私有方法:private 返回值类型 方法名称(参数列表) {方法体}

静态私有方法:private static 返回值类型 方法名称(参数列表) {方法体}

注意:private 的方法只有接口自己才能调用,不能被实现类或别人使用。

5. 接口不能直接使用,必须有一个「实现类」来「实现」该接口,格式:

public class 实现类名称 implements 接口名称 {

  // ...

}

注意:接口不能直接 new 接口对象使用,需要创建实现类的对象进行使用。

6. 一个类的直接父类是唯一的,但是一个类可以同时实现多个接口,格式:

public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB {

  // 覆盖重写所有抽象方法

}

注意:接口是没有静态代码块或者构造方法的。

         如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。

         如果实现类所实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写。

         一个类如果直接父类当中的方法和接口当中的默认方法产生了冲突,优先使用父类当中的方法。

抽象类是对根源的抽象

如何使用抽象类和抽象方法:

(1)不能直接创建 new 抽象类对象;

(2)必须用一个子类来继承抽象父类;

(3)子类必须覆盖重写抽象父类当中所有的抽象方法,即子类去掉抽象方法的 abstract 关键字,然后补上方法体大括号;

(4)创建子类对象进行使用。 

关于抽象类的使用,需注意:

1. 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。

    理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。

2. 抽象类中可以有构造方法,是供子类创建对象时,初始化父类成员使用的。

    理解:子类的构造方法中,有默认的 super(),需要访问父类构造方法。

3. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

    理解:未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设计。

4. 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。

    理解:假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有意义。

小结

1. 抽象类和接口都不能直接实例化,抽象类要被子类继承,接口要被类实现。

2. 一个类可以实现多个接口,但最多只能实现一个抽象类。

3. 实现类必须覆盖重写接口所有的抽象方法,除非实现类是抽象类。

4. 抽象方法所在的类,必须是抽象类才行;抽象类里可以没有抽象方法;

5. 类与类之间是单继承的,直接父类只有一个;类与接口之间是多实现的,一个类可以实现多个接口;接口与接口之间是多继承的。

posted on 2020-03-16 20:37  _那些你很冒险的梦  阅读(120)  评论(0)    收藏  举报

导航