1.接口的定义
🌈接口是一种特殊的抽象类,是Java提供的一个重要的功能,与抽象类不同的是:
- 🚀接口的所有数据成员都是静态的且必须初始化。
- 🚀接口中的所有方法必须都是抽象方法,不能有一般的方法。
[public] interface 接口名称 [extends 父接口名列表] { [public] [static] [final]数据类型 成员变量名 = 常量; ... [public][abstract]返回值数据类型 方法名(参数表); ... }
其中,成员方法必须都是抽象方法。接口定义的[ ]中的修饰符可以省略,省略后默认为以上访问权限。
---🍁分割线🍁---
✅2.接口的实现
🌈接口和抽象类一样不能用来实例化对象,必须借用接口的特征创建出来一个新的类,然后用新的类来实例化对象。
- 🚀利用接口创建新的类的过程称为接口的实现。
- 🚀实现一个接口的过程使用implements关键字。
class 类名称 implements 接口名表 { ... }
- 🚀如果实现某接口的类不是抽象类,那么它必须实现指定接口的所有抽象方法。
- 🚀类在实现接口的方法时必须显式的使用pulic访问权限修饰符,
子类覆盖父类方法时不可以缩小父类方法的访问权限范围。
---🍁分割线🍁---
✅3.接口的引用
🌈接口可以作为一种引用类型来使用,任何实现该接口的类实例化的对象都可以储存在该接口类型的变量中,通过这些变量访问类所实现的接口中的方法。
---🍁分割线🍁---
✅4.接口的继承
🌈当然啦!接口和类一样也可以使用继承派生出来新的类。也可以通过extends关键字来实现,被继承的接口称为父接口,派生出来的新接口称为子接口。但是不同的是,一个子接口可以同时有多个直接父接口。它们之间用逗号分隔。子接口继承父接口的所有变量和方法。
如果子接口中定义了和父接口同名的常量,父接口中的常量被隐藏,如果时方法,则被覆盖。
interface A{ abstract void print1(); } interface B extends A{ abstract void print2(); } class C implements B{ public void print1(){ System.out.print("Hello"); } public void print2(){ System.out.print("World"); } } public class Print{ public static void main(String[] args){ B b=new C(); b.print1(); b.print2(); } }
🌈其中B接口是A接口的直接父接口,C类实现B接口,覆盖B接口中的所有的抽象方法。Print类是主类,定义接口的引用指向实现它的类的实例化对象,访问类所实现的接口中的方法。(
接口作为引用数据类型使用
)
---🍁分割线🍁---
✅5.利用接口实现多重继承
🌈由于Java不支持多重继承,所以可以利用接口实现类似于多重继承的机制,同时规避了C++多重继承中存在很多歧义的问题,使代码更加简洁,逻辑清晰,安全可靠。
一个类只能有一个直接父类,但是它可以同时实现多个接口
,可以把接口理解为类,即实现了Java类的多重继承。
//filename:Cylinder.java interface Face1{ final double PI=3.14; abstract double area(); } interface Face2{ abstract void volume(); } public class Cylinder implements Face1,Face2{ private double radius; private int height; public Cylinder(double r,int h){ radius=r; height=h; } public double area(){ return PI*radius*radius; } public void volume(){ System.out.print("圆柱体的体积="+this.area()*height); } public static void main(String[] args){ Cylinder volu=new Cylinder(5.0,2); volu.volume(); } } //圆柱体的体积=157.0