42面向对象(高级)-接口 在 Java 中接口Interface是一种特殊的类它定义了一组方法的声明但并不提供方法的实现。接口定义了类应该提供哪些行为但并不规定这些行为的具体实现。接口是 Java 中实现多态和解耦的一个非常重要的机制。1.接口的定义接口使用interface关键字来定义。接口中的方法默认是抽象的即方法没有方法体只有方法签名。实现接口的类需要提供这些方法的具体实现。note1在Jdk7.0前 接口里的所有方法都没有方法体即都是抽象方法2Jdk8.0后接口可以有静态方法static默认方法default也就是说接口中可以有方法的具体实现interface MyInterface { // 接口中的方法默认是抽象方法 void method1(); // 不需要写 abstract因为默认就是抽象方法 // 接口中的常量默认是 public static final 的 int CONSTANT 10; // 从 Java 8 开始接口可以有默认方法default methods和静态方法 default void defaultMethod() { System.out.println(This is a default method.); } static void staticMethod() { System.out.println(This is a static method in the interface.); } }2.实现接口一个类使用implements关键字来实现接口并且必须提供接口中所有抽象方法的实现。实现接口的语法class MyClass implements MyInterface { // 实现接口中的抽象方法 public void method1() { System.out.println(method1 implemented.); } }3.接口的使用注意1不能实例化接口不能直接创建实例不能使用new创建对象你只能通过实现接口的类来创建对象。2接口中所有的方法是 public方法接口中抽象方法可以不用abstrag:修饰 图示:3一个普通类实现接口,就必须将该接口的所有方法都实现4抽象类实现接口时可以不用实现接口的方法。5一个类可以同时实现多个接口interface IB { void hi(); } interface Ic { void say(); } //一个类同时可以实现多个接口 class Pig implements IB,IC { 0verride public void hi(){ } 0verride public void say(){ } }6接口中的属性,只能是final的而且是 public static final 修饰符。比如: int a1 实际上是 public static final int a1;(必须初始化)因为是不可变的也可以称为常量。7接口中属性的访问形式: 接口名.属性名 static的特征8接口不能继承其它的类但是可以继承多个别的接口。接口和接口之间有继承关系接口和类是实现关系interfere B{} interfere C{} interface A extends B,C{}9接口的修饰符 只能是 public 和 默认这点和类的修饰符是一样的4.接口的用途定义行为规范接口定义了一些行为方法的规范不关心具体的实现。实现多态一个类可以实现多个接口实现不同的行为组合。解耦接口可以将代码中的类解耦使得代码更加灵活和可扩展。[即: 接口规范性动态绑定机制]5.接口和继承的比较关系当子类继承了父类就自动的拥有父类的功能。如果子类需要扩展功能可以通过实现接口的方式扩展。egclass A extends B implements C , D{}可以理解实现接口是对java单继承机制的一种补充.接口和继承解决的问题不同继承的价值主要在于解决代码的复用性和可维护性。接口的价值主要在于设计好各种规范(方法)让其它类去实现这些方法。即更加灵活接口比继承更加灵活继承是满足is - a的关系接口只需满足like - a 的关系。比如小猴子 是 一只猴子小猴子也可以像鱼一样游泳。区别特性继承Inheritance实现Implementation定义一个类继承另一个类继承父类的属性和方法。一个类实现一个接口提供接口中方法的具体实现。关键字使用extends关键字使用implements关键字继承的对象继承类子类继承父类实现接口类实现接口多继承Java 不支持类的多继承类只能继承一个父类。Java 支持类实现多个接口实现多重继承的效果。方法实现子类可以继承父类的已实现方法或者重写父类方法。类必须实现接口中的所有方法除非类是抽象的。构造方法继承父类的构造方法通过super()调用。接口没有构造方法。成员变量子类可以继承父类的成员变量。接口中没有成员变量只有常量public static final。访问修饰符继承的成员可以有不同的访问修饰符private、protected、public。接口中的方法默认是public实现类中的方法也必须是public。目的通过继承共享父类的功能和属性扩展父类的功能。通过实现接口规定类必须提供哪些行为规范。6.接口的多态特性1多态参数1.UsbInterface usbInterface 形参是接口类型 UsbInterface2.实现了UsbInterface接口的类的对象实例,都可以传入workeg1public class Computer{ public void work(UsbInterface usbInterface ) *** } /*在前面的Usb接口案例UsbInterface usb既可以接收手机对象又可以接收相机对象就体现了接口 多态(接口引用可以指向实现了接口的类的对象)*/eg2public class InterfacePolyParameter { public static void main(string[] args){ //接口的多态体现 //接口类型的变量if01可以指向实现了IF接口的对象实例 IF if01 new Monster(); if01 new car(); } } interface IF {} class Monster implements IF{} class Car implements IF{}2多态数组演示一个案例:给Usb数组中存放 Phone 和 相机对象Phone类还有一个特有的方法call()请遍历Usb数组如果是Phone对象除了调用Usb 接口定义的方法外还需要调用Phone 特有方法 call.public class InterfacePolyArr { public static void main(string[] args){ //多态数组-接口类型数组 Usb[] usbs new Usb[2]; usbs[0] new Phone(); usbs[1] new Camera(); /* 给Usb数组中存放Phone和相机对象Phone类还有一个特有的方法call()请遍历Usb数组如果是Phone对象除了调用Usb 接口定义的方法外还需要调用Phone 特有方法 call */ for(int i 0;i usbs.length; i){ usbs[i].work();//动态绑定. //和前面一样我们仍然需要进行类型的向下转型 if(usbs[i] instanceof Phone){//判断他的运行类型是 Phone_ ((Phone) usbs[i]).call(); } } } interfere usb{ void work(); } class phone implements usb{ public void call(){ System.out.println(手机可以打电话) } public void work(){ System.out.println(相机正在工作中) } } class camera implements usb{ public void work(){ System.out.println(相机正在工作中) } }3接口的多态传递练习interface A{ //1min 看看 int x0;}//想到 等价 public static final int x 0; class B{ int x1;}//普通属性 class C extends B implements A { public void pX(){ // System.out.println(x); //错误原因不明确x是谁的 //可以明确的指定x //访问接口的x就使用A.X //访问父类的x就使用super.x System.out.println(A.x super.x); } public static void main(String[] args) { new C().pX(); } }