什么是接口?
接口技术是用来描述类具有什么功能,而并不是给出每个功能的具体实现。
接口中的所有方法自动的属于public。
在接口中可以定义常量(自动定义为public static final),但是没有实力域。
接口的常量调用,直接接口名.常量名。
Java8中接口新增了静态方法和默认方法:
静态方法:Java8中,允许在接口中增加静态方法,但是这有违于将接口作为抽象规范的初衷。
目前为止,通常的做法是将静态方法放在伴随类中。在标准库中,你会看到成对出现的接口和使用工具类,如Collection/Collections或Path/Paths。
默认方法:Java8允许给接口添加一个非抽象的实现方法,只需要使用default关键字即可。这个方法又叫做扩展方法。默认方法和抽象方法的区别在于默认方法可以重写方法,也可以选择直接调用接口中的default方法。
优缺点:确保对Java8之前项目的兼容性,可以在不破坏代码的基础上扩展原有库的功能。但从另一方面,使接口作为协议,类作为实现的界限变得模糊了。
解决方法冲突:
多继承很容易会出现方法名一样的情况,java是怎么解决这种冲突的呢?
1)超类优先,如果超类提供了一个具体方法,同名且有相同参数类型的默认方法就会被忽略。
2)接口冲突,如果一个超接口提供了一个默认方法,另一个接口提供了一个同名且参数类型(不论是否是默认参数)相同的方法,必须覆盖这个方法来解决冲突。Java编译器会直接报告一个错误,让程序员来解决这个二义性——重写方法或者选择其中的某一个。
public interface TestInterface {
default void print(){
System.out.println("这是接口test中的print方法+++++++++");
}
}
public interface TestInterface01 {
default void print(){
System.out.println("这是接口test01的print方法1111111");
}
}
public class Test implements TestInterface,TestInterface01 {
@Override
public void print() {
TestInterface.super.print();
}
}
public static void main(String[] args) {
Test test=new Test();
test.print();
}
输出结果:
Cloneable接口:这个接口指示一个类提供了一个安全的clone方法。
克隆:copy一个初始状态和当前被克隆原对象数据一致的新对象。
浅克隆:copy所有的数据域,但不包括对象中引用的子对象。
深克隆:copy所有的数据,包括引用的子对象。
问题:
默认的克隆是浅克隆,并没有克隆对象中引用的其他对象。浅克隆会带来什么影响呢?这要看具体情况。如果原对象和浅克隆对象共享的子对象是不可变的,那么这种共享是安全的。如String,就是final类,没有更改器方法会改变它。不过,通常子对象是可变的,这种情况下,没有对子对象进行引用的拷贝,那么克隆对象和原对象共享一个子对象,修改克隆对象会直接修改原对象的数据,不安全,必须重新定义clone方法来建立一个深拷贝,克隆所有子对象。