接口的概念
接口是一个特殊的类,不能使用class关键字修饰,接口中的方法全部都是抽象方法,接口中的变量都是静态变量。比抽象类更抽象。
接口也是一种设计思想的体现。可以看作一张图纸(定义规范、要求。)
接口关键字interface
has…a…(…有一个…)这可以接口关系
is…a(…是一个…)这是继承关系
public interface 接口名{
//静态常量
//抽象方法
}
- 接口中的方法都是抽象方法:
public abstract
:(隐式存在) - 接口中的变量都是静态常量:
public abstract final
(隐式存在) - 接口是一个特殊类,不可以用class修饰
- 接口不能实例化
- 接口中不能有构造方法
- 接口是对继承的扩展,继承只能是单支继承,而一个类可以实现多个接口
- 一个类可以继承父类,同时可以实现多个接口
- 实现类必须实现接口中的全部方法,如果一个类只实现接口部分方法,那么必须把该类定义为抽象类
- 接口 也可以继承接口,接口可以实现多继承,一个接口可以实现多继承,但不能直接重写。
- 接口继承其他接口时,如果其他接口的抽象方法名重复,那么会默认使用第一个由此方法的接口,因为抽象方法没有具体实现,所以重写那个抽象方法都是一样的。
- 类只能继承类,类只能实现接口
- 可以把部分类具有的行为和能力抽象出来作为接口使用
如何实现接口
- 实现接口
implements
public class 类名 implements 接口名{
//可以直接使用接口中的静态常量
//实现接口中的抽象方法
}
接口定义的条件
满足…has…a关系
抽象类和接口有哪些区别
- 定义上:抽象类:abstract类名 接口:interface 接口名
- 具体内上:抽象类:在抽象类中可以定义普通方法,定义成员变量,定义构造方法;接口:只能定义静态常量和抽象方法,不能定义构造方法
- 共同点:都不能实例化
- 都是一种设计思想的体现,都需要子类去继承或者实现接口
- 抽象类和接口都可以使用多态,都是多态的体现,扩展了多态的特性。
使用多态的写法实例化对象
- 如果是普通类:
父类 变量名=new 子类();
- 如果是抽象类:
抽象类 变量名=new 子类();
- 如果是接口:
接口 变量名=new 实现类();
理解接口的优势
- 接口增加了代码的扩展性,突破了JAVA的单继承的局限性,让程序能够扩展更多功能
- 更好的体现出多态的优势
- 实现代码的解耦合
抽象类和接口的选择
- 抽象类侧重的是子类全部共有的属性和方法
- 接口侧重的是部分子类具有的一些行为和能力,然后用实现类去实现
接口作为参数类型使用=多态
接口在使用多态时,是不用向下转型的!!!
package com.m.demo3;
public class Computer {
private Usb uFace;
public Usb getuFace() {
return uFace;
}
public void setuFace(Usb uFace) {
this.uFace = uFace;
}
public void work() {
Usb u=this.getuFace();
u.inface();
// if(u instanceof FS) {
//
// ((FS)u).inface();
// }else if(u instanceof Mouse) {
// ((Mouse)u).inface();
// }else if(u instanceof U) {
// ((U)u).inface();
// }else {
// System.out.println("电脑不存在此类接口");
// }
}
}
package com.m.demo3;
public class Test {
public static void main(String[] args) {
Usb U1=new FS();
Usb U2=new Mouse();
Usb U3=new U();
Computer c=new Computer();
c.setuFace(U3);
c.work();
c.setuFace(U2);
c.work();
c.setuFace(U1);
c.work();
// c.work(U3);
// c.work(U2);
// c.work(U1);
}
}
接口如何实现代码的解耦合
Java设计程序中:提倡高内聚,低耦合。
耦合:代码与代码之间的额关系紧密。可以看作依赖性
解耦合:让代码与代码之间能独立运行
接口可以实现代码的解耦合