
接口的使用
-
接口使用
interface
来定义。 -
Java中,接口和类是并列的结构。
-
如何定义接口,定义接口中的成员
1、 JDK7以前,只能定义全局常量和抽象方法
全局常量:public static final
,但是书写时可以省略
抽象方法:public abstract
2、 JDK8,除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法 -
接口中不能定义构造器,因此接口不能实例化
-
Java开发中,接口通过让类去实现(
implements
)的方式来使用
如果实现类覆盖了接口中所有的抽象方法,则此实现类就可以实例化
如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类 -
Java类可以实现多个接口------>弥补了Java单继承的局限性
格式:class AA extends BB implements CC,DD,EE
-
接口与接口之间可以继承,而且可以多继承
interface AA extends BB,CC
-
接口的具体使用,体现多态性
-
接口,实际上可以看做是一种规范
package com.atguigu.java;
public class InterfaceTest {
public static void main(String[] args) {
System.out.println(Flyable.MIN_SPEED);
}
}
interface Flyable{
public static final int MAX_SPEED = 7900;
int MIN_SPEED = 1;//默认是全局常量,省略了public static final
public abstract void fly();
void stop();//默认是抽象方法,省略了public abstract
}
class Plane implements Flyable{ //实现了所有的抽象方法,可以实例化
@Override
public void fly() {
System.out.println("fei");
}
@Override
public void stop() {
System.out.println("ting");
}
}
abstract class kite implements Flyable{ //没有实现所有的抽象方法,要声明为抽象类,不能实例化
@Override
public void fly() {
// TODO Auto-generated method stub
}
}
创建接口的匿名实现类的对象
Computer computer = 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("结束工作");
}
};
//4.创建了接口的匿名实现类的匿名对象
com.transferData(new USB() {
@Override
public void start() {
System.out.println("开始工作");
}
@Override
public void stop() {
System.out.println("结束工作");
}
});
接口的应用:代理模式(proxy)
- 应用场景
1、安全代理
2、远程代理
3、延迟加载 - 分类
静态代理
动态代理:JDK自带动态代理,需要反射等知识。
package com.atguigu.java;
public class NetWorkTest {
public static void main(String[] args) {
Server server = new Server();
ProxyServer proxyServer = new ProxyServer(server);//体现了接口的多态性:形参类型是NetWork接口,实际传入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;
}
@Override
public void browse() {
check();
work.browse();
}
public void check() {
System.out.println("联网之前的检查工作");
}
}
工厂模式
工厂模式:实现创建者和调用者的分离,即将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
JDK8接口新特性
package com.atguigu.java8;
public class SubClassTest {
public static void main(String[] args) {
SubClass s = new SubClass();
//1、接口中定义的静态方法,只能通过接口来调用
CompareA.method1();
//2、通过实现类的对象,可以调用接口中的默认方法
//3、如果重写了接口的默认方法,则调用重写后的方法
s.method2();
//4、如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的方法
//那么子类在没有重写此方法的情况下,默认调用的是父类的方法 --->类优先原则
s.method3();
//5、如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法
//那么在实现类没有重写此方法的情况下,报错-->接口冲突
//这就需要我们必须在实现类中重写此方法
}
}
class SubClass extends SuperClass implements CompareA{
public void method2() {
System.out.println("SubClass");
}
public void method3() {
System.out.println("Subclass:深圳");
}
//6、如何在子类(或实现类)的方法中调用父类、接口中被重写的方法
public void myMethod() {
method3();//调用自己定义的重写的方法
super.method3();//调用的是父类声明的方法
CompareA.super.method3();//调用接口中的默认方法
}
}
网友评论