欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 第三章 3.13 接口

第三章 3.13 接口

2024/10/24 21:34:46 来源:https://blog.csdn.net/tiao_tiao_hu/article/details/141993750  浏览:    关键词:第三章 3.13 接口

1.知识点

2.根据接口的举出语法的实例代码

package com.baidu.com.jia.jiekou;/*** 1.接口(interface)在Java中表示一种规范或契约,它定义了一组抽象方法和常量,用来描述一些实现这个接口的类应该具有哪些行为和屈性。接口和类一样,也是一种引用数据类型。* 2.接口怎么定义?[修饰符列表]interface 接口名{}* 3.抽象类是半抽象的,接口是完全抽象的。接口没有构造方法,也无法实例化。*      (抽象类是有构造方法的,因为构造方法是给子类用的,想super()方法就理解了。)* 4.(JDK8之前的语法规则)接口中只能定义:常量+抽象方法。接口中的常量的static final可以省略。接口中的抽象方法的abstract可以省略。接口中所有的方法和变量都是public修饰的。* 5.接口直接可以多继承* 6.类和接口的关系我们叫做实现(这里的实现也可以等同看做继承)。使用implements关键字进行接口的实现。* 7.一个非抽象的类实现接口必须将接口中所有的抽象方法全部实现(强制要求的,必须的,要不然编译器报错).* 8.一个类可以实现多个接口。 语法是:class 类 implements 接口A,接口B{}* 9.Java之后,接口中允许出现默认方法和静态方法(JDK8新特性)*      默认方法:引入默认方式是为了解决接口演变问题:接口可以定义抽象方法,但是不能实现这些方法。*              所有实现接口的类都必须实现这些抽象方法。*              这会导致接口升级的问题:当我们向接口添加或删除一个抽象方法时,这会破坏该接口的所有实现,*              并且所有该接口的用户都必须修改其代码才能适应更改。这就是所谓的”接口演变”问题*      静态方法:注意:java中规定,在JDK8之后,接口中可以一定静态方法,但是这个静态方法,只能通过“该接口名”去调用的。别的都无法调用。*              在JDK8之后引入接口可以定义静态方法,实际上想表达一个意思:接口也可以作为工具来使用了。* 10.JDK9之后允许接口中定义私有的实例方法(为默认方法服务的)和私有的静态方法(为静态方法服务的)*** **/
public interface MyInterface {public static final int number = 1;//3.抽象类是半抽象的,接口是完全抽象的。接口没有构造方法,也无法实例化。//3.void m2(){}; 错误写法,不能有方法体。void m2();//4. public abstract 可以省略public abstract void m1();//9.默认方法default void defaultMethod(){System.out.println("接口中的默认方法defaultMethod执行了");}// 10.JDK9之后允许定义私有的静态方法。(给静态方法服务的)static void staticMethod(){System.out.println("接口的静态方法执行了");}}interface A{void a();
}interface  B{void b();
}//5.接口直接可以多继承
interface C extends A,B{void c();
}
//6.类和接口的关系我们叫做实现(这里的实现也可以等同看做继承)。使用implements关键字进行接口的实现。
class MyInterfaceImpl implements MyInterface,C{@Overridepublic void c() {System.out.println("c执行了");}@Overridepublic void a() {System.out.println("a执行了");}@Overridepublic void b() {System.out.println("b执行了");}@Overridepublic void m2() {System.out.println("m2执行了");}@Overridepublic void m1() {System.out.println("m1执行了");}
}

主程序:

package com.baidu.com.jia.jiekou;public class MyInterfaceTest {public static void main(String[] args) {//这只是一个变量,是一个引用。//使用接口类型也可以定义引用。MyInterface myInterface = null ;//没有使用多态机制
//        MyInterfaceImpl mii = new MyInterfaceImpl();
//        mii.a();
//        mii.b();
//        mii.c();
//        mii.m1();
//        mii.m2();// 使用了接口之后,为了降低程序的耦合度:一定要让接口和多态联合起来。//父类型引用执行子类型对象。MyInterface mi = new MyInterfaceImpl();mi.m1();mi.m2();mi.defaultMethod();}
}

3.接口的作用 (有无接口区别)

3.1实例代码

3.1.1无接口代码

假如说电脑要连打印机,在定义一个新的类,这部分符合OCP(可扩展原则),但是Computer电脑类的源码改变,不符合OCP原则。

这个程序没有使用接口。分析存在哪些缺点?

        违背OCP 开闭原则。

        Computer类的扩展力差

        为什么?
        Computer类中使用了HardDriver类,以及Printer类导致Computer类和HardDrive,Printer合度太高Computer类扩展力太差。

public class Computer {//连接方法public void conn(HardDrive hardDrive){System.out.println("连接设备成功");hardDrive.read();hardDrive.write();}
}public class HardDrive {public void read(){System.out.println("硬盘开始读数据");}public void write(){System.out.println("硬盘开始写数据");}
}public class Test {public static void main(String[] args) {HardDrive hardDrive =  new HardDrive();Computer computer = new Computer();computer.conn(hardDrive);}}

3.1.2接口代码

Computer是调用者,剩下的是实现者,分清调用者和实现者,定义接口,

public void conn(Usb usb){
        System.out.println("连接设备成功");
        usb.read();
        usb.write();
    }

本质上是用的多态:

Usb usb = new HardDrive();

public class Computer {//连接方法public void conn(Usb usb){System.out.println("连接设备成功");usb.read();usb.write();}
}public class Printer implements Usb {public void read(){System.out.println("打印机开始读数据");}public void write(){System.out.println("打印机开始打印了");}
}public class HardDrive implements Usb {public void read(){System.out.println("硬盘开始读数据");}public void write(){System.out.println("硬盘开始写数据");}
}//主程序
public class Test {public static void main(String[] args) {HardDrive hardDrive =  new HardDrive();Printer printer =  new Printer();Computer computer = new Computer();computer.conn(hardDrive);computer.conn(printer);}
}

 3.1.3例子代码

//接口
public interface Menu {void XiHongShiChaoDan();void YuXiangRouSi();void GongBaoJiDian();
}//厨师一和厨师二
public class Cooker implements Menu{private String name;public Cooker(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void XiHongShiChaoDan() {System.out.println("西红柿炒蛋做好了");}@Overridepublic void YuXiangRouSi() {System.out.println("鱼香肉丝做好了");}@Overridepublic void GongBaoJiDian() {System.out.println("宫保鸡丁做好了");}
}public class Cooker2 implements Menu{private String name;public Cooker2(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void XiHongShiChaoDan() {System.out.println("2西红柿炒蛋做好了");}@Overridepublic void YuXiangRouSi() {System.out.println("2鱼香肉丝做好了");}@Overridepublic void GongBaoJiDian() {System.out.println("2宫保鸡丁做好了");}
}//顾客
package com.baidu.com.jia.jiekoushili;/*** 顾客面向菜单点菜* */
public class Customer {public void order(Menu menu){//调用的都是接口中的方法,面向接口编程,面向抽象编程,降低程序耦合度,提高程序扩展力menu.GongBaoJiDian();menu.XiHongShiChaoDan();menu.YuXiangRouSi();}
}//主程序
package com.baidu.com.jia.jiekoushili;public class Test {public static void main(String[] args) {Cooker cooker = new Cooker("山东厨师");Customer customer = new Customer();Cooker2 cooker2 = new Cooker2("陕西厨师");customer.order(cooker);}
}

接口与抽象类如何选择

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com