Java基础之接口(interface)详解

对Java核心技术卷的一个简单笔记


前言

总结一下基础阶段接口常见的问题

1.接口的概念

接口 ,由于Java没有多继承,只有单继承,那么需要多个类同时满足一些需求的时候怎么办呢。这就是接口的设计意义,它是希望符合这个接口的类满足的一些需求。可以看作是一种规范。

public interface Comparable {
	
}

2.接口的声明格式

[修饰符] interface 接口名{

 // 公共的静态常量
 // 公共的抽象方法
 
 // 公共的默认方法(JDK1.8 以上)
 // 公共的静态方法(JDK1.8 以上)
 // 私有方法(JDK1.9 以上)
}

为什么Java8以后允许公共的静态方法,和默认方法呢

静态方法
因为之前的标准类库设计中,有很多 Collection/Colletions 或者Path/Paths 这样成对的接口和类,后面的类中都是静态方法,而这些静态方法都是为前面的接口服务的,那么这样设计一对 API,不如把静态方法直接定义到接口中使用和维护更方便。
默认方法
(1)我们要在已有的老版接口中提供新方法时,如果添加抽象方法,就会涉及到原来使用这些接口的类就会有问题,那么为了保持与旧版本代码的兼容性,只能允许在接口中定义默认方法实现。比如:Java8 中对Collection、List、Comparator 等接口提供了丰富的默认方法。
(2)当我们接口的某个抽象方法,在很多实现类中的实现代码是一样的,此时将这个抽象方法设计为默认方法更为合适,那么实现类就可以选择重写,也可以选择不重写。
Tips:Java9可以用私有方法
使用的的很有限,因为private导致只能在几口本身的方法中使用,用途有限,更多是最为接口中其他方法的辅助方法

3.接口的属性

(1)接口不是类。不可以用new实例化接口
(2)可以声明接口,用实现了接口的类来实现
(3)可以用instanceof‘判断对象是都属于哪个接口
(4)接口中所有的方法被设置为public,所有变量总是默认为public static final

4.接口和抽象类的区别

接口(interface)和抽象类最大的区别是多继承和单继承的问题导致的。引入接口的原因也是因为Java是单继承语言,抽象类有着和接口类似的功能,但是限制于单继承。一个类只能继承一个抽象类但是却可以实现多个接口,这就是接口类似于多继承功能的优势。一般来说能设计成接口尽量设计成接口。抽象类和接口还有一些具体的不同。接口可以继承大多数多继承的优势,同时避免多继承的复杂性和低效性。
在这里插入图片描述

5.继承和接口混合使用的一些规则

(1)接口可以继承多个接口,关键字是extends,
(2)可以同时继承父类和实现接口,继承关键字在前,实现关键字在后
(3)接口与实现类对象构成多态引用,实现类实现接口,类似于子类继承父类.
	因此,接口类型的变量与实现类的对象之间,也可以构成多态引用。通过
	接口类型的变量调用方法,最终执行的是你 new 的实现类对象实现的方法体。
 (4)接口不能直接创建对象,但是可以通过接口名直接调用接口的静态方法和静态常量
 (5)对于接口的静态方法,直接使用“接口名.”进行调用即可
    也只能使用“接口名."进行调用,不能通过实现类的对象进行调用
    对于接口的抽象方法、默认方法,只能通过实现类对象才可以调用
    接口不能直接创建对象,只能创建实现类的对象
(1) interface A extends 接口1,接口2 {
}2class B extends C implements 接口1,接口2 {
}3)不粘贴具体代码,比较长,自己可以下去谢谢

(4)接口.静态方法名()
	接口.静态变量

6.继承父类和实现接口时的一些同名冲突问题

我们思考一下这个问题,一个类同时可以继承一个父类和实现多个接口。那么,冲突主要来自如下几种情况:

  • 父类和接口之间同名冲突
  • 实现的多个接口之间的同名冲突
    那么来看看怎么解决吧,分为方法名冲突和变量名冲突

6.1方法名冲突

(1)对于父类和接口之间的同名冲突
遵守的是类优先原则,当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的抽象方法重名,子类就近选择执行父类的成员方。

(2)实现的多个接口之间的同名冲突。
当一个类同时实现了多个父接口,而多个父接口中包含方法签名相同的默认方法时,怎么办呢?

  • 声明接口:选择保留其中一个,通过“接口名.super.方法名"的方法选择保留哪个接口的默认方法。

当一个子接口同时继承了多个接口,而多个父接口中包含方法签名相同的默认方法时,怎么办呢?

  • 子接口重写默认方法
  • 子接口重写默认方法时,default关键字可以保留。
  • 子类重写默认方法时,default关键字不可以保留。

6 .2常量名冲突

(1)当子类继承父类又实现父接口,而父类中存在与父接口常量同名的成员变量,并且该成员变量名在子类中仍然可见。
通过“接口名.变量名"的方法引用父接口的成员变量

(2)当子类同时实现多个接口,而多个接口存在相同同名常量。
此时在子类中想要引用父类或父接口的同名的常量或成员变量时,就会有冲突问题。

通过“super.变量名"的方法引用父类的成员变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值