接口的定义与使用
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

浙公网安备 33010602011771号