第六章 抽象类和接口

学习路线

 抽象类和抽象方法必须使用“abstract”关键字来修饰。 

定义抽象类和抽象方法的规则如下:

  • abstract关键字放在class前,指明该类是抽象类;
  • abstract关键字放在方法的返回类型前,指明该方法是抽象方法,抽象方法没有方法体;
  • 抽象类不能被实例化即无法使用new关键字直接创建抽象类的实例,即使抽象类中不包含抽象方法也不行;
  • 一个抽象类中可以含有多个抽象方法,也可以含有已实现的方法;
  • 抽象类可以包含成员变量以及构造方法,但不能通过构造方法创建实例,可在子类创建实例时调用;
  • 定义抽象类有三种情况:直接定义一个抽象类;或继承一个抽象类,但没有完全实现父类包含的抽象方法;
  • 或实现一个接口,但没有完全实现接口中包含的抽象方法。

接口

Java允许一个类实现多个接口,这样使程序更加灵活、易扩展。

接口语法说明

  • 访问符可以是public或缺省,如果缺省访问符,则默认采用包权限访问控制,即在相同包中才可以访问该接口;
  • 一个接口可以继承多个父接口,但接口只能继承接口,不能继承类;
  • 在接口体里可以包含静态常量、抽象方法、内部类、内部接口以及枚举的定义,从Java 8版本开始允许接口中定义默认方法、类方法;
  • 与类的默认访问符不同,接口体内定义的常量、方法等都默认为public,可以省略public关键字,即当接口中定义的常量或方法不写public,其访问权限依然是public。
  1. 系统自动为成员变量增加public static final 进行修饰
  2. 系统自动为普通方法增加public abstract 进行修饰
  3.  默认方法必须使用default 关键字进行修饰,通过接口的实现类的实例对象来调用默认方法

接口定义示例 

 

类方法必须使用static关键字修饰,必须有方法实现,可以直接通过接口来调用类方法

只有在Java 8以上的版本才允许在接口中定义默认方法和类方法。

接口中定义的内部类、内部接口以及内部枚举都默认为public static。 

因接口中的内部类、内部接口和内部枚举应用不广泛,本书不做具体介绍。

实现接口 

  •  接口不能直接实例化,但可以使用接口声明引用类型的变量,该变量可以引用到接口的实现类的实例对象上。
  • 接口的主要用途就是被实现类实现,一个类可以实现一个或多个接口。 

[访问符] class 类名 implements 接口1[,接口2...]{   

 //类体

}

语法说明

  • implements关键字用于实现接口;
  • 一个类可以实现多个接口,接口之间使用逗号进行间隔;
  • 一个类在实现一个或多个接口时,这个类必须完全实现这些接口中定义的所有抽象方法,否则该类必须定义为抽象类;
  • 一个类实现某个接口时,该类将会获得接口中定义的常量、方法等,因此可以将实现接口理解成一种特殊的继承,相当于实现类继承了一个彻底抽象的类。

实现类示例 

 

可以声明接口变量,并用接口变量指向当前接口实现类的实例,下面的语句是正确的

使用接口变量指向该接口的实现类的实例对象,这种使用方式也是多态性的一种体现。

接口的继承与类的继承不一样,接口完全支持多重继承,即一个接口可以有多个父接口。

除此之外,接口的继承与类的继承相似;当一个接口继承父接口时,该接口将会获得父接口中定义的所有抽象方法、常量。

一个接口继承多个接口时,多个接口跟在extends关键字之后,并使用逗号“,”进行间隔。

示例 

一个Java源文件中可以有多个接口和类,但最多只能有一个接口或类是public,

且该源文件的文件名必须与public接口名或类名一致。

例如:在MyInterface.java源文件中文件名与public接口的接口名“MyInterface”一致;

在InterfaceExtendsDemo.java源文件中有三个接口和一个类,文件名与public类的类名“InterfaceExtendsDemo”一致。

接口和抽象类有很多相似之处

  • 接口和抽象类都不能被实例化,需要被其他类实现或继承;
  • 接口和抽象类的类型变量都可以指向其实现类或子类的实例对象;
  • 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类时都必须实现这些抽象方法。 

接口和抽象类的 区别

  • 接口中除了默认方法和类方法,不能为普通方法提供方法实现(没有方法体);而抽象类则完全可以为普通方法提供方法实现;
  • 接口中定义的变量默认是public static final,且必须赋初值,其实现类中不能重新定义,也不能改变其值,即接口中定义的变量都是最终的静态常量;
  • 而抽象类中的定义的变量与普通类一样,默认是缺省,其实现类可以重新定义,也可以根据需要改变其值;
  • 接口中定义的方法都默认缺省的是public,而抽象类则与类一样是默认缺省的;
  • 接口不包含构造方法,而抽象类可以包含构造方法,抽象类的构造方法不是用于创建对象,而是让其子类调用以便完成初始化操作;
  • 一个类最多只能有一个直接父类,包括抽象类;
  • 但一个类可以直接实现多个接口;一个接口可以有多个父接口。

 示例

 instanceof关键字

“instanceof”关键字用于判断前面的“引用类型变量”是否是后面的“引用类型”,或者其子类、实现类的实例;如果是,则返回true,否则返回false。

总结 

  • 抽象类和抽象方法必须使用“abstract”关键字来修饰
  • 抽象类不能被实例化
  • 抽象方法是未实现的方法,它与空方法是两个完全不同的概念
  • abstract也不能和private、static、final或native同时修饰同一方法
  • 接口用来弥补Java只支持单一继承的缺陷
  • 定义接口使用interface关键字
  • 接口体内定义的常量、方法等都默认为public
  • 接口不能直接实例化
  • implements关键字用于实现接口
  • 一个接口继承多个接口时,多个接口跟在extends关键字之后,并使用逗号“,”进行间隔
  • instanceof关键字用于判断对象类型

猜你喜欢

转载自blog.csdn.net/qq_45598881/article/details/116016156