1.接口(interface 关键字)
1.定义:
将抽象进行得更彻底,使所有方法都是抽象方法,所有方法都不提供具体的实现一种更为特殊的"抽象类"
2.格式:
/**
*定义一个接口
*/
public interface 接口名{
//任意数量static final 常量
//任意数量抽象方法
}
3.接口和类:
相似:
①接口不能被实例化;
②接口不包含任何构造器;
③接口中的所有方法都是抽象的;
④接口中不能包含实例成员变量。唯一可以出现在接口中的成员变量必须是同时声明为static和final;
⑤接口不能被一个类继承,只能被一个类来实现;
⑥一个接口能够继承多个接口。
区别:
接口不是类。虽然编写接口类似于编写一个类,但它们是两个不同的概念。类描述了对象的属性和行为,而接口包含了一个类需要实现的行为
4.接口具有的性质:
①接口默认是抽象的。在声明接口时,不需要使用关键字abstract;
②接口中的每一个方法默认也是抽象的,所以也不需要关键字abstract;
③接口中的方法默认访问级别是public。 在编写接口的时候通常用public关键字,但是如果我们不显式地将接口中的方法声明为public,它仍然将是public的。
高内聚低耦合
耦合:一个软件结构内不同模块之间互连程度的度量
低耦合比较好,如果耦合度高了,代码之间的联系比较高,一旦代码出现问题或者代码需要修改,那么需要一次性修改完
内聚:一个模块内各个元素彼此结合的紧密程度
高内聚是尽可能的让每个元素都紧密的相连。充分利用每一个元素的功能,各施所能,以最终实现某个功能,如果内聚度低了,说明代码还并不够完善
2.接口的实现:
格式:
/**
*使用接口
*/
public class A implement 接口名字(多个用逗号隔开){}
作用:
实现接口的类必须实现接口里所有的方法
一个类可以实现多个接口
3.接口的应用
厨师和司机的示例:
/**
*Cooker 接口
*/
public interface Cooker {
public void cooking();
public void steamed();
}
/**
*Driver接口
*/
public interface Driver {
public void driver();
}
/**
* Man类实现了接口Cooker Driver
*/
public class Man implements Cooker,Driver{
public void driver() {
System.out.println("我是老司机,我会开车");
}
public void cooking() {
System.out.println("我是厨师,我会烹饪");
}
public void steamed() {
System.out.println("我是厨师,我清蒸");
}
}
/**
* 厨师类
*/
public class CookerLei {
public void cook(Cooker c){
c.cooking();
c.steamed();
}
}
/**
*司机类
*/
public class DriverLei {
public void driving(Driver d){
d.driver();
}
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
DriverLei driverLei = new DriverLei();
Man man = new Man();
driverLei.driving(man);
CookerLei cookerLei = new CookerLei();
cookerLei.cook(man);
}
}
4.接口的继承
一个接口能够继承另外的一个接口,类似于一个类能够继承另外一个类
关键字extends被用于继承接口,子接口继承了父接口中的方法
示例:
// B,C,D 是其他接口
public interface A extends B,C,D{}
在出现继承几个接口中拥有两个或者两个以上的抽象方法,保留一个即可
标记接口:一个没有任何方法的接口
5.接口多态:
示例:
/**
* 哺乳动物类
*/
public class Mammal {
public void breathe() {
System.out.println("哺乳动物在呼吸");
}
}
/**
* Play接口
*/
public interface Play {
public void playFetch();
public void playCatch();
}
/**
* Dog类 继承了 哺乳动物类 实现了玩的接口
*/
public class Dog extends Mammal implements Play {
public void playFetch() {
System.out.println("狗正在追赶");
}
public void playCatch() {
System.out.println("狗正在捕捉");
}
public void sleep() {
System.out.println("狗正在睡觉");
}
}
/**
*测试类
*/
public class Test {
public static void main(String[] args) {
Dog fido = new Dog();
Mammal rover = new Dog();
Play spot = new Dog();
Object pooch = new Dog();
fido.sleep();
}
}
在测试类中可以看出
接口也遵循自动向上转型的形式 从而实现多态
6.接口和抽象类的区别
抽象类规范的是与生俱来的行为
接口规范的是扩展的行为
接口最大的作用是 降低耦合度
语法上:
1 接口:interface 抽象:abstract
2.接口不能放置构造器,实例成员,而抽象类可以放置
3.接口是通过implement实现方式,来完成抽象的实现
抽象类是通过实现extend继承的实现,来完成抽象的实现
4.抽象类中的所有抽象方法都必须采用 abstract来定义,在接口中默认的就是abstract
5.抽象类的父类是object, 接口的父类不知道
6.抽象类可以实现接口 , 接口不能继承抽象类
7.抽象类只能单继承 接口可以多继承
使用上:
接口和抽象类都可以定义抽象方法,但是抽象类中描述的是类与生俱来的方法,而接口中的抽象方法事外
部扩展给类的方法