接口和内部类为我们提供了一种将接口与现实分离的更加结构化的方法(不像其它语言一样只是概念,而有实际的语法支持结构)
抽象类
关键字:
abstract
,加在抽象类或抽象方法前:abstract class{}; abstract void(int a){}
包含抽象方法的类叫抽象类(没有抽象成员变量这种东西),只要包含一个抽象方法,那该类就必须限定为抽象类(写上abstract关键字,否则报错)
抽象方法仅声明方法、没有方法体
抽象类中可以包含非抽象方法
继承抽象类如果不实现所有抽象方法,那么导出类依然是抽象类
抽象类中的成员变量会继承给导出类
不可建立抽象类对象
接口
关键字:
interface
,与class
是不同的东西,替代class关键字:interface ABC{}
①接口导出为具体类叫做“实现”该接口使用
implements
关键字,一个具体类可以实现多个接口(JAVA中的唯一实现多重继承的方式)②接口之间(导出为接口)可以继承,使用
extends
关键字,且接口继承接口可以多重继承但注意一个类只能继承一个具体类/抽象类
接口中的成员变量会被继承给导出类
接口中所有方法都不能提供方法体(相比抽象类更抽象了,完全抽象),所有方法都是自动
abstract
的但有例外:接口中的
default
方法可以有方法体default void forEach{xxx}
子类优先继承父类的方法, 如果父类没有相同签名的方法,才继承接口的默认方法
具体类必须实现接口的所有方法;如果不实现所有抽象方法,那么导出类就会是抽象类
接口的设计就可以做到:“你可以用任何你想要的对象来调用我的方法,只要你的对象遵循我的接口”,以
Scanner
举例,Scanner
接受一个Readable
接口的实现类对象,只要满足这个接口,那就可以输入进Scanner
中,我们在使用键盘输入的时候输入Scanner
的就是System.in
,它就实现了Readable
接口多重继承
java中一个具体类可以同时继承一个具体类,并实现多个接口
class Hero extends ActionCharacter implements CanFight, CanSwin, CanFly{}
(继承需写在前)
使用接口的核心原因:①为了能够向上转型为多个基类类型(以及为此带来的灵活性)
对于接口
interface Fruits
以及实现该接口的子类Apple
,这样引用是OK的:Fruits apple = new Apple();
,子类也可以向上转型为接口引用②与抽象类一样,防止创建该类的对象,确保仅仅是建立一个接口
如果知道某事物应该成为一个基类,那么第一选择应该是使它成为一个接口
经常某类会继承一个父类(子类is a 父类),并实现若干接口(会打篮球,会跳舞接口,etc,内部有具体的动作方法)
注意权限问题
所有的抽象方法(接口中和抽象类中)的访问权限一定都是
public
所以子类在实现该方法的时候,一定要带上
public
权限关键字!因为JAVA中方法和类的默认权限是包访问权限,即本包中的类可以访问,并不是
public
权限接口中的成员变量也是自动
public
的嵌套接口
接口也可以在一个类中,就像内部类一样,内部类可以实现该内部接口,内部的嵌套接口也必须是
public
的工厂方法
在工厂对象上调用创建方法,而该工厂对象将生成接口的某个实现的对象
像一个专门负责生成对象的工厂一样,这个工厂里生成的对象都符合某接口标准
工厂方法可以做到代码与接口的实现分离
工厂类中的方法可以作静态方法,或者使用更加优雅的方式:匿名内部类(只有内部类才可以是静态类)
【接口没有构造器】