接口
程序员文章站
2022-07-14 10:42:28
...
接口
- 不是类,是一个抽象类型,是内部定义了一组规范的抽象集合(interface),所有实现接口的类要遵循规范(implements)
- 接口中的方法(规范)默认为 public abstract
- 接口中不能有实例域、静态方法,且没有方法体
public interface Comparable{
int comparaTo(Object other);
}
1.8以后,接口可以静态方法和方法体
public interface Path{
public static Path get(String first, String ... more){
return FileSystem.getDefault().getPath(first,more);
}
}
-
类要实现接口的要求:
1.implements interfaceName
2.对接口内的所有方法进行定义且为public,若没有全部定义则为抽象类 -
特性:
不能使用new一个实例化对象
可以声明接口变量,必须引用实现了接口的类对象
Comparable x; //声明接口
x = new Employee(); //Employee实现了接口Comparable
可以使用instanceof检查某个对象是否实现了某个接口
Employee instanceof Comparable
可以扩展(继承)extends;一个接口可以继承多个接口,逗号隔开
可以包含常量,默认public static final
public interface Powered extends Moveable{
double milesPerGallon();
double SPEED_LIMIT = 95;
}
一个类可以实现多个接口,用逗号隔开
class Employee implements Cloneable,Comparable{}
-
接口与类的比较
-
接口的默认方法(default):类在实现接口时可以不用实现默认方法,要有方法体
作用:可以实现接口演化(当接口被类实现后,要为接口添加新的方法,若此方法不卫默认方法,则容易出错,默认方法保证了源码的兼容性)
public interface MouseListener{
default void mouseClicker(MouseEvent event){};
default void mousePressed(MouseEvent event){};
...
}
默认方法冲突(类的多实现,接口的多继承造成):先在一个接口中定义了一个默认方法,然后又在超类或另一个接口中定义了同样的方法
解决方法:
1.超类优先:如果超类提供了具体方法,其他所有提供的同名同参数的默认方法都会被忽略
interface Named{
default String getName(){
return getClass().getName() + "_" +hashCode();
}
}
class Student extends Person implements Named{
...//优先考虑Person类中的getName()方法
}
2.接口冲突:若一个超接口提供了一个默认方法,另一个接口提供了同名同参的(无论是否为default)方法,在实现的类中都要重写这个方法
class Student implements Person, Named{
public String getName(){
return Person.super.getName();//若两个都有,可以这样在重写的方法中则其一进行解决,也可自己重写
}
...
}
- 接口与抽象类
- 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
- 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法,1.8以后可以有了),而抽象类是可以有静态代码块和静态方法。
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。