接口的定义与使用

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();
}
posted @   萧若風  阅读(244)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示