接口的定义与使用

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  萧若風  阅读(275)  评论(0)    收藏  举报