java1.8新特性之接口
目前,虽然java以及发展至java21,但java8(jdk8)作为目前依旧使用最多的jdk版本,无外乎免费的依旧是最香的,且功能足够满足我们日常的使用,所以平时面试时,大多数还是基于java8进行提问,今天总结一下interface的新特性,就当温故而知新了。
Interface改动原因
旧的jdk1.8由于在接口中新增一个函数后,会要求所有该接口的实现类必须实现新增的方法,对于一些复杂的场景,编码使用略显不变,于是基于这个原因进行了特性整改
新的jdk1.8可通过关键字 default 和 static修饰函数
1.default修饰的方法,普通示例,可以用this调用,可以被子类继承和重写
2.static修饰的方法,普通的方法,使用和一般静态方法一样,不能被子类继承,只能用Interface调用
default代码示例:
interface ITest1 {
void def11();
default void def13() {
System.out.println("this is interface function");
}
}
interface ITest2 {
void def21();
void def22();
}
class Test implements ITest1 {
@Override
public void def11() {
}
public static void main(String[] args) {
new Test().def13(); // 输出 this is interface function
}
}
static代码示例:
interface ITest1 {
void def11();
default void def13() {
System.out.println("this is interface function");
}
static void def14() {
System.out.println("this is interface static function");
}
}
interface ITest2 {
void def21();
void def22();
}
class Test implements ITest1 {
@Override
public void def11() {
}
public static void main(String[] args) {
// new Test().def13();
ITest1.def14(); // 输出 this is interface static function
}
}
众所周知,java只有单继承,其中的一项原因就是防止函数冲突,就是父类存在相同的函数时,由于类具有继承性,此时程序便不知道执行哪个函数了,导致了程序的紊乱。接口存在多实现,是因为接口不存在函数体,必须要重写,重复也不所谓, 那么目前接口可以定义函数内容了,实现类同样可以继承,那么遇到冲突了,函数是怎样处理的呢?
答案是:必须重写
代码示例:
interface ITest1 {
default void def13() {
System.out.println("ITest1 : this is interface function");
}
}
interface ITest2 {
default void def13() {
System.out.println("ITest2 : this is interface function");
}
}
class Test implements ITest1,ITest2 {
public static void main(String[] args) {
new Test().def13();
}
}
异常提示:com.xx.Test inherits unrelated defaults for def13() from types com.xx.ITest1 and com.xx.ITest2
翻译的意思是:Test类从毫无关系的族的ITest1和ITest2接口中继承了def3()函数。
意思表明ITest1和ITest2无关系,不能同时继承。
更改过后 interface和abstract class的区别
个人见解:接口和抽象类始终最大的区别在于场景的应用,interface的使用场景更多的在于结构性的编程:例如多态的实现,定义函数规范。重在定义结构和规范。 而abstract class更多的应用在代码复用上:例如继承,共享代码。重在复用。使用的场景根据实际环境选择即可。
更加详细的对比如下:
抽象类的使用场景:
- 代码重用和继承:抽象类可以包含具体的方法实现,因此可以作为其他类的基类,从而实现代码的重用和继承。
- 共享代码:如果多个相关的类有一些公共的方法实现,可以将这些实现放在抽象类中,避免重复编写。
- 限制类的实例化: 抽象类无法被实例化,因此可以用于限制某个类的直接实例化,只能通过其子类来创建对象。
- 约束子类:抽象类可以定义抽象方法,强制子类实现这些方法,从而约束子类的行为。
- 钩子方法:抽象类可以定义一些具体的方法,但留出某些方法需要子类去实现,以实现模板方法模式。
接口的使用场景:
- 多继承:Java 不支持多继承,但一个类可以实现多个接口,因此接口可以用于实现类似多继承的特性。
- 解耦和多态:接口可以用来实现对象的多态性,降低了类之间的耦合度,使得程序更加灵活和可扩展。
- 定义规范:接口定义了一组方法签名,用于规定实现类必须提供的方法,从而确保实现类的一致性。
- 实现不相关类的共同行为:接口可以将不相关的类连接起来,使它们拥有共同的行为,从而更好地实现一些横切关注点。
- 适配器模式:接口可以用于实现适配器模式,允许不相关的类协同工作。
- 点赞
- 收藏
- 关注作者
评论(0)