接口的定义与使用

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 @ 2022-06-22 20:26  萧若風  阅读(303)  评论(0)    收藏  举报