接口和内部类为我们提供了一种将接口和实现分离的更加结构化的方法,而在Java中,可以使用接口(Interface)和抽象类(abstract class)来实现。
抽象类
Java提供了一种抽象方法机制,这种方法是不完整的,仅有声明而没有方法体:
包含抽象方法的类就是抽象类,一个类只要有抽象方法,就必须被限定为抽象类,否则编译器报错。抽象类不能够创建对象,继承一个抽象类,出发实现全部抽象方法,
否则,该类仍然是抽象类。抽象类的发明就是为了继承,因此一切违反它继承特性的行为都是不成立的,例如类和方法用final修饰等。
抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。
抽象方法必须由子类来进行重写。
只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。
抽象类中可以包含具体的方法,当然也可以不包含抽象方法。
子类中的抽象方法不能与父类的抽象方法同名。
abstract不能与final并列修饰同一个类。
abstract 不能与private、static、final或native并列修饰同一个方法。
8 抽象类可以有构造函数,这是因为子类继承该抽象类时,调用构造函数时,需要先调用父类的构造函数。
接口
接口在Java当中是通过关键字interface来实现,接口不是类,所以也不能被实例化,接口是用来建立类与类之间的协议,它的提供的只是一种形式,而没有具体的实现。实现类实现(implements)接口,必须实现接口的全部方法
接口是抽象类的延伸,Java不允许多重继承(即不能有多个父类,只能有一个),但可以实现多个接口。在使用接口的过程中,就注意以下几个问题:
接口中不能有构造方法。
接口的所有方法自动被声明为public,而且只能为public,如果使用protected、private,会导致编译错误。
接口可以定义”成员变量”,而且会自动转为public final static,即常量,而且必须被显式初始化。
接口中的所有方法都是抽象方法,不能包含实现的方法,也不能包含静态方法
实现接口的非抽象类必须实现接口的所有方法,而抽象类不需要
不能使用new来实现化接口,但可以声明一个接口变量,它必须引用一个实现该接口的类的对象,可以使用instanceOf来判断一个类是否实现了某个接口,如if (object instanceOf ClassName){doSth()};
在实现多接口的时候一定要注意方法名的重复接口可以多重继承。
接口和抽象类的区别
语法层次
抽象类使用abstract定义,而接口使用interface定义。
抽象类可以有具体的数据成员,而接口只能是public final static的常量。
从方法上来说,抽象类中可以有非抽象方法(普通方法),而接口中必须全是抽象方法。
子类继承抽象类,单一继承;子类实现接口,可以多重实现
设计层次
抽象类是对类的抽象,它包含数据和方法;而接口是对行为的抽象,仅仅只针对行为
跨域不同,抽象类和子类时继承关系,存在is a的关系;而接口不要求子类和基类有相似的关系,是like a的关系,接口仅仅定义一套规则给子类,让子类去实现