什么是接口?
接口不是类,是对类的以组需求描述。
接口怎么定义?
1)关键字 interface
2)接口中的方法和域,全部都默认为 public static final,可不必提供关键字,所以说接口没有实例域
接口怎么实现?
用类来实现接口:
1)将类声明为实现给定的接口,使用关键字 implement
2)对接口中的所有方法进行定义
3)和抽象方法一样,接口也没有实例,但是可以有接口变量,但他必须引用实现了他的类的对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4M0MtWy8-1584806313967)($resource/1584762399(1)].jpg)
任何实现了Comparable接口的类都需要包含compareTo方法,并且这个方法的参数必须是一个Object对象,返回一个整数值
public interface Comparable
{
int compareTo(Object other);
}
或者使用新的comparable接口,他是一个泛型的类习惯
public interface Comparable<T>
{
int compareTo(T other);
}
新旧方法对比:不适用泛型则需要收栋讲compareTo方法的参数强制转换为所希望的类型。
旧方法例子:
public int compareTo(Object otherObject)
{
Employee other (Employee)otherObject;//手动转型,向下造型,强制转换
return Double.compare(salary,other.salary);
}
新方法例子:
public int compareTo(Employee otherEmployee)
{
return Double.compare(salary,otherEmployee.salary);//不需要转型
}
接口的默认方法
为接口方法提供一个默认实现,用default修饰
public interface Comparable<T>
{
default int compareTo(T other){
//关键字default修饰
return 0;
}
}
默认方法可以调用任何其他方法
public interface Collection
{
int size();//一个抽象方法
default boolean isEmpty(){
return size() == 0;
}
}
Comparable的每一个实际实现依旧可以覆盖这个默认方法。
什么时候需要使用这种默认方法?
比如指定了一个功能”搬砖“,10个里面有八个是“搬砖”,只有两个是“活水泥”,我就可以用一个default默认接口方法,只要我不修改他,他就是”搬砖“,而有个别需要修改的,我才修改它为“活水泥”,“运沙子”等等别的功能。
解决默认方法冲突
情况一:父类和接口拥有完全相同的方法,一个子类同时继承了父类又实现了接口
情况二:父类和接口拥有方法签名相同,但返回值不同的方法,一个子类同时继承了父类又实现了接口
情况三:两个接口拥有完全相同的方法,一个类同时实现了两个接口
情况四:两个接口拥有相同方法签名,但返回值不同的方法,一个类同时实现了两个接口
Java解决二义性的规则:
1)超类优先。如果超类提供了一个具体方法,接口中同名且又相同类型参数的方法会被忽略。
2)接口冲突。两个接口提供了同名同参数列表的相同方法,必须覆盖这个方法来解决。
3)不允许一个类同时继承和实现,或者同时实现两个方法签名相同,但是返回值不同的方法,因为那样根本无法解决掉二义性的问题。或者不使用implement实现,使用lambda表达式实现接口可以使用不同接口中的完全相同的方法
解决方法:
情况二和情况四,无法解决二义性问题,一个函数中不能存在方法签名相同,返回类型不同的函数
情况一:父类优先,可以不必再实现这个接口,当然非要实现这个接口,等价于重写它父类的方法
情况三:选择其中一个进行覆盖就可以了。