接口的定义与使用
1、接口的定义与使用:
① 定义:使用 interface。
② 在Java中,接口与类是并列的两个结构。
③ 如何定义接口:定义接口中的成员。
Ⅰ.在JDK7及之前的版本,只能定义全局常量和抽象方法。
全局常量:public static final 的(编写时,可以省略)
抽象方法:public abstract 的
Ⅱ.JDK8,除了定义全局常量和抽象方法以外,还可以定义静态方法、默认方法(略)。
④ 接口中不能定义构造器,则接口不可以实例化。
⑤ Java开发中,接口通过让类去 实现(implements)的方式来使用。
Ⅰ.如果实现类覆盖了接口中所有的抽象方法,则此实现类就可以实例化。
Ⅱ.如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍是一个抽象类。
⑥ Java类可以实现多个接口,弥补了Java单继承的局限性。
格式:class A extends B implements C,D,E
⑦ 接口与接口之间可以继承,而且可以多继承。
⑧ 接口的具体使用,体现多态性。
⑨ 接口,实际上可以看做是一种规范。
例如:
package com.test.hello; /* *接口的使用: *1.接口的使用也满足多态性 *2.接口,实际上就是定义了一种规范 *3.开发中,体会面向接口编程 */ public class USBTest { public static void main(String[] args) { Computer com = new Computer(); //1.创建接口的非匿名实现类的非匿名对象 Flash flash = new Flash(); com.transferData(flash); //2.创建接口的非匿名实现类的匿名对象 com.transferData(new Printer()); //3.创建接口的匿名实现类的非匿名对象 USB phone = new USB(){ @Override public void start() { System.out.println("手机开始工作"); } @Override public void stop() { System.out.println("手机结束工作"); } }; com.transferData(phone); //4.创建接口的匿名实现类的匿名对象 com.transferData(new USB(){ @Override public void start() { System.out.println("MP3结束工作"); } @Override public void stop() { System.out.println("MP3结束工作"); } }); } } //电脑 class Computer{ public void transferData(USB usb){ usb.start(); System.out.println("具体的传输细节"); usb.stop(); } } interface USB{ //常量:定义了长宽最大最小的传输速度 void start(); void stop(); } //U盘 class Flash implements USB{ @Override public void start() { System.out.println("U盘开启工作"); } @Override public void stop() { System.out.println("U盘结束工作"); } } //打印机 class Printer implements USB{ @Override public void start() { System.out.println("打印机开启工作"); } @Override public void stop() { System.out.println("打印机结束工作"); } }
2、接口的应用1:代理模式:
(1)例如:
package com.test.hello; /* *接口的应用:代理模式 */ public class NetWorkTest { public static void main(String[] args) { Server server = new Server(); ProxyServer proxyServer = new ProxyServer(server); proxyServer.browse(); } } //通用接口 interface NetWork{ public void browse(); } //被代理类 class Server implements NetWork{ @Override public void browse() { System.out.println("真实的服务器访问网络"); } } //代理类 class ProxyServer implements NetWork{ private NetWork work; public ProxyServer(NetWork work){ this.work = work; } public void check(){ System.out.println("联网之前的检查工作"); } @Override public void browse() { check(); work.browse(); } }
(2)应用场景:
安全代理:屏蔽对真实角色的直接访问
远程代理:通过代理类处理远程方法调用(RMI)
延迟加载:先加载轻量级的代理对象,真正需要时再加载真实对象
(3)分类:
静态代理:静态定义代理类
动态代理:动态生成代理类
3、接口的应用2:工厂模式
工厂模式分类:
无工厂模式
简单工厂模式
工厂方法模式
抽象工厂模式
4、JAVA8 中接口的新特性:
(1)接口中定义的静态方法,只能通过接口来调用。
(2)通过实现类的对象,可以调用接口中的默认方法。如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写以后的方法。
(3)如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法。
(4)如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,就会报错。(原因:接口冲突)
解决方法:必须在该实现类中重写此方法。
(5)如何在子类(或实现类)的方法中调用父类、接口中被重写的方法?(如下所示)
public void myMethod(){ method3(); //调用的是子类(实现类)中自定义的,重写的方法 super.method3(); //调用的是父类中声明的方法 //调用接口中的默认方法 CompareA.super.method3(); CompareB.super.method3(); }
本文来自博客园,作者:萧若風,转载请注明原文链接:https://www.cnblogs.com/XiaoRuoFeng/p/16402190.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~