Java中什么是接口(interface)?
接口(interface)
文章目录
- 接口(interface)
-
认识接口的本质
-
准确理解接口的基本概念,并掌握其基本使用方法
-
深入理解并展示出接口所具有的多态特性
-
基础练习:识别并纠正错误代码片段
- 第一道题
- 第二道题
- 代码题:接口练习、比较对象大小
-
接口的理解
- 首先,在多个类中生成一个子类时会继承所有属性和行为。然而,在Java中无法实现多层继承效果。通过使用接口,则可获得类似的效果。
- 此外,在多个类间提取出一些共有行为特征时会更为合适(这些类之间并无is-a关系),即它们只是具备相同的功能即可。
例如:鼠标、键盘、打印机、扫描仪、摄像头、充电器、MP3机、手机、数码相机及移动硬盘等设备均支持USB连接功能。 - 接口本质上相当于规范一组规则的行为模式,并体现了现实世界中"如果你是...则必须具备...能力"的思想。
- 接口的本质是契约与标准:就像法律一样具有约束力与普遍性标准一样具有指导性作用。

详细阐述:如同前面所述,在信息传递机制中存在一种现象即多种电子设备均配备有USB接口以实现数据传输功能;然而这种现象并不意味着所有设备都需要直接从USB接口继承其功能属性。具体而言,在这一结构中例如在本章所介绍的各种实例中可以看到不同类型的实体可能基于不同的基类构建起自己的属性体系;其中值得注意的是跨栏运动员与大学生这类特殊群体虽然均具备学习能力但在传统的面向对象编程范式下无法同时将这两个特性统一归因于一个共同的基础类型为此在Java语言中引入了‘接口’这一概念从而实现了对多态性的支持. 通过使用接口实现多态性, Java语言的功能得到了显著提升.

解释 :这里的子弹就是多个接口,既可以飞,也具有攻击性
接口的定义与使用


总结来说:
接口使用interface
2.在java中,类和接口是并列的结构
3.如何定义接口:定义接口中的成员
3.1、jdk7及以前:
>全局常量:public static final的,但是书写时,可以省略不写
>抽象方法:public abstract的
3.2、jdk8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法(略)
4.接口中不能定义构造器!意味着接口不可以实例化
5.Java开发中,接口都通过让类去实现(implements)的方式来使用
如果实现类重写了(覆盖了)接口中的所有抽象方法,则实现类就可以实例化
如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍然为一个抽象类
6.Java可以实现多个接口——————>弥补了Java单继承性的局限性
格式 class AA extends BB implements CC,DD,EE{}
7.类和类之间是继承,接口可类之间是实现,接口和接口之间也是继承,而且是多继承。
8.接口的多实现与接口的继承性(先继承后实现)
代码解读
以上几点对应看代码理解:
package day3.InterfaceTest;
public class interfaceTest {
public static void main(String[] args) {
System.out.println(Fly.MAX_SPEED);
System.out.println(Fly.MIN_SPEED);
// Fly.MAX_SPEED==1;这里不让重新赋值,public static final没写只是因为可以省略,但是没写它依旧存在
}
}
interface Fly{
//全局常量
public static final int MAX_SPEED = 7900;
int MIN_SPEED=1;//省略了public static final
//抽象方法
public abstract void fly();
void stop();//省略了:public abstract
}
interface Attackable{
void attack();
}
class Plan implements Fly{
@Override
public void fly() {
System.out.println("通过引擎起飞");
}
@Override
public void stop() {
System.out.println("驾驶员减速");
}
}
class Bullet extends Object implements Fly,Attackable,CC{//实现多个接口
@Override
public void fly() {
}
@Override
public void stop() {
}
@Override
public void attack() {
}
@Override
public void method1() {
}
@Override
public void method2() {
}
}
//接口和接口之间也是继承,而且是多继承
interface AA{
void method1();
}
interface BB{
void method2();
}
interface CC extends AA,BB{
}
代码解读
接口的使用体现多态性
接口本质上就是一种规范性规定:这里指的是遵循USB规范。不论是使用U盘还是其他如打印机等设备与电脑传输数据时,都必须按照该接口的技术规范来操作。代码如下:
package day3.InterfaceTest;
//模拟usb的使用
//第四步
public class UsbTest {
public static void main(String[] args) {
computer comp1 = new computer();//用电脑传输数据,需要先造一个电脑的对象
flash flash1 = new flash();//传输数据需要u盘
comp1.transferDate(flash1);//电脑用U盘传输数据
}
}
//第三步
class computer {//定义了一个类,电脑
public void transferDate(USB usb) {//定义了一个方法传输数据,并且需要一个设备去传输,这里就放入了USB
usb.start();//需要先把usb连接上
System.out.println("传输数据等待");//正在传输数据
usb.stop();//需要关闭usb
}
}
//第一步
interface USB {
//常量:定义了长、宽和最大最小传输数据等等
void start();
void stop();//简单定义了两个抽样方法打开和关闭
}
//第二步
class flash implements USB {//定义了一个类U盘,实现了USB接口
//重写接口里面的抽象方法
public void start() {
System.out.println("U盘开启");
}
public void stop() {
System.out.println("U盘关闭");
}
}
class printer implements USB {//定义了一个类打印机,实现了USB接口
//同样重写接口里面的抽象方法
public void start() {
System.out.println("打印机开启");
}
public void stop() {
System.out.println("打印机关闭");
}
}
代码解读
简单练习题:排错
第一题

此处编译失败,在涉及变量x的引用时存在歧义。在之前的讨论中提到过,在涉及变量x的引用时存在歧义,在这种情况下,默认情况下可能会产生混淆或错误的结果。在这里之前也已经提到了这一点,在这种情况下,默认情况下可能会产生混淆或错误的结果。然而,在这种情况下,默认情况下可能会产生混淆或错误的结果这一观点并未得到广泛接受或支持,在这种情况下,默认情况下可能会产生混淆或错误的结果这一观点并未得到广泛接受或支持的情况下,默认情况下可能会产生混淆或错误的结果这一观点并未得到广泛接受或支持的情况下,默认情况下可能会产生混淆或错误的结果这一观点并未得到广泛接受或支持的情况下,默认情况下可能会产生混淆或错误的结果这一观点并未得到广泛接受或支持的情况下,默认情况下可能会产生混淆或错误的结果这一观点并未得到广泛接受或支持的情况下,默认情况下可能会产生混淆或错误的结果这一观点并未得到广泛接受或支持的情况下,默认情况下可能会产生混淆或错误的结果这一观点并未得到广泛接受或支持的情况下,默认情况下可能会产生混淆或错误的结果这一观点并未得到广泛接受或支持的情况下,默认情况下可能会产生混淆或其他结果的情况可能会影响系统的稳定性
修改过后代码:
package NiuKeTest;
interface A {
int x = 0;
}
class B {
int x = 1;
}
class C extends B implements A {
public void pX() {
System.out.println(super.x);//1(可以用super关键字调用父类的属性)
System.out.println(A.x);//0(这里的x是一个全局变量,直接用接口去调)
}
public static void main(String[] args) {
new C().pX();
}
}
代码解读
第二题

在本实现中对代码进行了详细说明:首先是创建并设置了两个公共接口,默认均包含一个抽象方法play。接着创建了一个Rollable接口,并使其继承了这两个已有的公共接口。在此基础上新建了一类Ball对象。其次Ball类也实现了Rollable这一公共接口。直接声明了一个属性字段,并为其编写了对应的get getter方法。并在此基础上新建了一组初始化构造器函数。随后重载了这个抽象的方法play以适应特殊需求
考点1:这个重写的play方法,到底是重写的哪一个接口的?
答:因为这两个接口的抽象方法的方法名重名了,所以两个都同时重写了、
考点2:(错误点)Ball方法中的对Ball的使用有错误
回答:在接口中定义的是全局常量,并且不需要显式声明public static final关键字。这相当于Rollable接口内部的ball变量是一个全局常量,在这种情况下已经被固定下来无法更改。然而,在Ball类内部又重新实现了新的对象以覆盖这一行为(尽管这可能会导致编译器报错)。
代码题:接口练习、比较对象大小

答案:
建立一个接口用于比较两个对象。 interface CompareObject{ public int compareTo(Object o); //若返回值等于零,则表示两者相等;若结果为正值,则当前对象较大;若结果为负值,则当前对象较小
package day3.LxtEnd;
public interface CompareObject {
public int compareTo(Object o);
}
代码解读
- 定义一个Circle类,声明redius属性,提供getter和setter方法
package day3.LxtEnd;
public class Circle {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
public Circle() {
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
}
代码解读
创建ComparableCircle类对象使其既继承Circle类又满足CompareObject接口,在ComparableCircle类中为compareTo方法提供具体的实现逻辑用于比较两圆半径大小程度。
//学习内容:
//开发时间:2022/9/30 18:50
package day3.LxtEnd;
public class ComparableCircle extends Circle implements CompareObject {
public ComparableCircle(double radius) {
super(radius);
}
@Override
public int compareTo(Object o) {
if (this == o) {
return 0;
}
if (o instanceof ComparableCircle) {
ComparableCircle c = (ComparableCircle) o;
//return this.getRadius().compareTo(c.getRadius());
//假如半径不声明为基本数据类型,而用包装类Double,就可以像上面这样调用方法去比较,而不用去if比较
if (this.getRadius() > c.getRadius()) {
return 1;
} else if (this.getRadius() < c.getRadius()) {
return -1;
} else {
return 0;
}
} else {
return 0;//传入数据类型不对返回0,后面可以用抛异常的方式处理,这里忽略
}
}
}
代码解读
编写一个名为InterfaceTest的测试类,在其中生成两个ComparableCircle类型的实例对象,并通过调用compareTo方法比较这两个实例对象的半径值
package day3.LxtEnd;
public class InterfaceTest {
public static void main(String[] args) {
ComparableCircle c1 = new ComparableCircle(3.6);
ComparableCircle c2 = new ComparableCircle(3.4);
int i = c1.compareTo(c2);
if (i>0){
System.out.println("c1半径大于c2");
}else if(i<0){
System.out.println("c1半径小于c2");
}else {
System.out.println("c1和c2半径相等");
}
}
}
new ComparableCircle(3.6);
ComparableCircle c2 = new ComparableCircle(3.4);
int i = c1.compareTo(c2);
if (i>0){
System.out.println("c1半径大于c2");
}else if(i<0){
System.out.println("c1半径小于c2");
}else {
System.out.println("c1和c2半径相等");
}
}
}
代码解读
