接口和抽象类的理解与异同

既然要说接口和抽象类的异同,那么就要先说明什么是抽象类什么是接口。

 

接口和类的定义

抽象类:指使用abstract修饰,并且只定义了方法头,而没有方法体和具体实现的方法。是对一种事物的抽象,即对类抽象。

接口(interface:是一种特殊形式的抽象类,可以理解为一个“纯”抽象类是对能力(行为)的抽象。

 

理解类和接口

例如定义一个学生类和唱歌接口。定义一个名叫张三的类,张三是一个学生,那么就可以继承学生这个类,而他会唱歌那么就实现这个接口,同为学生的李四类,不会唱歌那么就只继承学生类而不去实现唱歌接口。可以看出这是一种技能的抽象,你有唱歌的能力,那么你就去实现,没有就不去实现。

 

抽象类的深度理解

    1. 抽象类是不能进行实例化操作;

    2. 抽象类中可以没有抽象方法,但是有抽象方法的类一定是一个抽象类;

    3. 子类可以实现(重写)父类的抽象方法。如果没有实现父类的抽象方法,则该子类还是抽象的。也就是说子类(非抽象类)必须重写父类抽象方法;

    4.抽象类中可以包含构造方法和静态方法,以及静态变量。但构造方法和静态方法不能是抽象的;

    5. 抽象方法不能定义为private,抽象方法主要是用来被其他的子类进行重写;

    6.final,static不能修饰抽象方法( final定义的方法不能被重写);

抽象类和普通类的主要三点区别:

  1.抽象方法必须为public或者protected,缺省情况下默认为public;

     2.抽象类不能实例化;

  3.如果一个类继承于一个抽象类,子类可以实现(重写)父类的抽象方法。如果没有实现父类的抽象方法,则该子类

         还是抽象的。

       

接口的深度理解

用于规定一个对象应该用于哪些公共的操作方法,这个也叫接口(公共操作方法的集合)

    1.接口中所有的方法全部都是“抽象”的,这些方法只有方法头,但没有方法体,默认不用abstract关键字;

    2.接口中只有public, abstract, default, static 可以修饰接口中的方法,默认使用public abstract进行修饰

    3.接口中不可以包含构造方法和静态方法。(1.8之后可以写静态方法,但现阶段不能写静态代码块);

    4.接口中的成员变量默认使用public static final进行修饰,即接口中没有成员变量只有常量

    5.接口可以通过extends进行多继承多个接口中间用“,”隔开。

类与接口

     1.类实现接口,利用关键字implements完成;

     2.一个类可以实现多个接口,在多个接口中间用“,”隔开;

     3.当多个类实现同一个接口,而这些类需要实现同一个方法时,可以在接口中定义静态方法(jdk1.8之后)。

 

接口与抽象类的异同

 

相同点:

抽象类和接口都不能直接实例化,它们都位于继承树的顶端,用于被其他类实现和继承。如果需要调用内部方法则需要定义匿名内部类;

抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类;

接口和抽象类都可以包含抽象方法。

不同点

    1.接口里只能定义静态常量,不能定义普通成员变量,抽象类里则既可以定义普通成员变量,也可以定义静态常量;

    2.抽象类要被子类继承,接口要被类实现;

    3.接口可继承接口,并可多继承接口,但类只能单根继承(java 中所说的单继承,多实现);

    4. 接口里不能包含初始化块,但抽象类里完全可以包含初始化块(jdk1.8之后接口可以写静态方法,现阶段不能写静

        态代码块);

    6.抽象类 和接口都是用来抽象具体对象的,但是接口的抽象级别最高;

    9.接口不能包含构造器(构造方法),抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类

      调用这些构造器来完成属于抽象类的初始化操作。

猜你喜欢

转载自blog.csdn.net/HY845638534/article/details/84206650