Java面向对象——接口

在讲接口之前,我们要先弄明白为什么会有接口?父类是存整个体系中的共性,接口是可以在其中单独定义一个方法,在子类中可以调用这个方法,可以把接口理解成是一种规则,只要符合规则就可以使用。我们会讲五个内容:

1.如何定义和使用接口;

2.接口里边成员的特点;

3.JDK8之后的新方法;

4.接口的应用;

5.适配器设计模式

1.接口的定义和使用:接口用关键字interface来定义,public interface 接口名{};

接口和类之间是实现关系,通过implements关键字表示,public class 类名 implements 接口名{}

注意,接口不能创建对象;接口和类的实现关系,可以单实现,也可以多实现。实现类还可以在继承一个类的同时实现多个接口。

java 复制代码
package java_day12;

public interface English {
    public abstract void Speak();
}

我们可以定义一个English的接口,然后写上抽象类的speak函数

java 复制代码
package java_day12;

public class PingpongCoach extends Coach implements English{
    public PingpongCoach() {
    }

    public PingpongCoach(String name, int age) {
        super(name, age);
    }

    @Override
    public void teach() {
        System.out.println("乒乓球教练"+this.getName()+"在教打乒乓球");
    }

    @Override
    public void Speak() {
        System.out.println("乒乓球教练"+this.getName()+"在说英语");
    }
}

当我们在类中实现接口的时候,因为定义的抽象函数,所以必须重写,这就是接口的实现。

2.接口中的成员特点:

成员变量:只能是常量;默认修饰符:public static final。无构造方法

成员方法 只能是抽象方法 默认修饰符:public abstract

JDK7 以前:接口中只能定义抽象方法。

JDK8 的新特性:接口中可以定义有方法体的方法。

JDK9 的新特性:接口中可以定义私有方法。

现在我们先当接口只能使用抽象方法,后续JDK8和9的特性我们会在后边说。

这个代码就很好的证明了,成员变量是用public static final修饰的。用public修饰的原因是在Test中也可以访问a;用static修饰的原因是可以直接用Inter.a来调用;用final修饰的原因是因为在Test中如果我们要修改a的值会报错。这些各种情况就都证明了,接口中的成员变量是由public static final修饰的。但是在写的时候我们不需要写出来,这是Java自己会给加的,初学阶段可以写上。

接口和类的关系

类和类的关系:继承关系,只能单继承,不能多继承,但是可以多层继承

类和接口的关系:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。

接口和接口的关系:继承关系,可以单继承,也可以多继承。

3.现在我们来讲一下从JDK8开始在接口中新增的方法

JDK8 的新特性:接口中可以定义有方法体的方法。

JDK9 的新特性:接口中可以定义私有方法。

JDK8新特性 :允许在接口中定义默认方法,但需要用关键字default修饰,作用:解决接口升级的问题。

接口中默认方法的定义格式:public default 返回值类型 方法名(参数列表){};

接口中默认方法的注意事项

1.默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字。

2.public可以省略,default不能省略

3.如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写

看这部分代码,如果我们在Inter中有默认方法show了,在他的实现类中如果我们要重写是不能加default的,如果加了,代码就会报错。

JDK8新特性 :允许在接口中定义静态方法,需要用static修饰

接口中静态方法的定义格式:

格式:public static 返回值类型 方法名(参数列表){}

注意事项:静态方法只能通过接口名调用,不能通过实现类名或者对象名调用。

public可以省略,static不能省略。

经过static修饰的不能被重写,只不过是恰好重名罢了。

JDK9 的新特性 :接口中可以定义私有方法。

在JDK9及以后的版本中,可以自定义接口中的私有方法,为什么可以这样呢?

我们看这段代码,在他的两个show方法中,都进行了共同的代码运行,如果每次单独写这个的话是非常的麻烦,在之前的版本我们可以单独写一个show方法,把运行代码的这部分写到新的show方法里,但是之前版本是不能私有定义的,也就是说这个跑代码的部分谁都可以调用,对安全性不太好,所以在JDK9以后我们就可以直接在接口里边定义私有方法了。

定义私有方法有两种,一种是普通的私有方法;一种是静态的私有方法,看下图介绍的就是这两种方法。

4.接口的应用:这一部分,只有一点需要注意的

我们看这个图片中,如果我们定义的搬家这个方法,他的参数是一个运输的接口,那么只要是满足是implements这个接口的类,都可以用,就像左边的车和搬家公司,只要他们都重写了运输,那么就都能被拿来用,这也就是接口的多态。

接口的应用这部分总结一下就是,接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了;当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态.

5.适配器设计模式:在讲这个知识点之前,我们要先熟悉一下什么叫设计模式。设计模式 是一套被反复使用、多数人知晓的、经过分类编目的、代码涉及经验的总结。使用涉及模式是为了可重用代码,让代码更容易被他人理解,保证代码的可靠性、程序的重用性。

简单理解:涉及模式就是各种套路。

适配器设计模式:解决接口与接口实现类之间的矛盾问题。

当我们在接口中创建了10个方法,然后在类中如果我们想用第五个的话,但是由于规定,所以必须把10个方法都全部重写。但是我们只想用第五个该怎么办?那么我们就新建一个类,叫做InterAdapt,让这个类去实现接口Inter,然后在这个类中把所有的方法进行空实现。之后再创建InterImpl这个类,再让这个类去继承之前的InterAdapt,在这个类中,我们需要用到哪个方法,就重写哪个方法就可以了。

一般来说我们对于中间这个类,我们会给他改成抽象类,不让外界去创建它的对象。

然后就按照图片里这样在InterImpl这里重写单独的第五个方法即可。这就是适配器设计模式。

总结:1.当一个接口中抽象方法过多,但是我只需要使用其中一部分的时候,就可以使用适配器设计模式。

2.写步骤: 编写中间类XXXAdapter,实现对应的接口

对接口中的抽象方法进行空实现

让真正的实现类继承中间类,并重写需要用的方法

为了避免其他类创建适配器类的对象,中间的适配器类用abstract进行修饰。

相关推荐
wuyk5551 小时前
107.FreeRTOS 链表深度解析:从原理到面试满分答案
c语言·开发语言·数据结构·stm32·单片机·链表·面试
geovindu1 小时前
CSharp: Wordcloud
开发语言·后端·c#·.net·.netcore·词云
苏生Susheng1 小时前
【软件实施】Windows 服务器运维实战
java·运维·服务器·windows·spring boot·javaweb·实施
Java小白笔记1 小时前
Java 实现 ZIP 压缩包生成方案
java·开发语言·网络·7-zip
Persistent的粽子!1 小时前
C++:类与对象(一)
开发语言·c++·经验分享·笔记
weixin_440730502 小时前
使用pytest中方法控制执行步骤(test_begin.py、test_end.py,@pytest.mark.run(order=1))
开发语言·python·pytest
霸道流氓气质2 小时前
Spring AI 多模态开发指南:图片理解与语音合成
java·人工智能·spring
en.en..2 小时前
Linux mmap 内存映射深度解析:基于帧缓冲 /dev/fb0
java·服务器·前端
geovindu2 小时前
CSharp: Command Pattern
开发语言·后端·c#·.net·.netcore·命令模式·行为模式