接口中的属性默认有:static final 修饰符修饰;
定义的方法默认是抽象方法;在jdk1.8中可以写默认方法和静态方法;
一、默认方法
允许在接口中提供方法的默认实现,这样实现类就不必实现这些方法,除非需要自定义行为。这一特性通过在方法前加上 default
关键字来实现。
定义语法:
interface InterfaceName{
default returnType methodName(arg-list){ }
}
默认的访问修饰符是public
interface A{
default void test(){
System.out.println("Default Method test in A");
}
}
两大优势:
-
可以让接口更优雅的的升级,减少使用人员操作的负担;
不必随着接口方法的实现,从而修改实现代码,因为默认方法在子类用可以不用实现;
-
可以让实现类中省略很多不必要的方法的空实现;
接口继承与默认方法的冲突:
例如:一个类C,实现两个接口A、B,其中接口B继承接口A
interface A{
default void test(){
System.out.println("A");
}
}
interface B extends A{
default void test(){
System.out.println("B..");
}
}
class C implements A,B{
public static void main(String[] args) {
C c=new C();
c.test();
}
}
//运行结果:
B..
方法调用的判断规则:
- 类中声明的方法优先级最高:类或父类中声明的方法要高于任何默认方法的优先级;
- 如果无法根据第一条进行判断,那么子接口的优先级更高;例如:B接口继承了A接口,那么B接口就比A接口更具体,优先级更高;
- 最后,- 还是无法判断,那么继承了多个接口的类,必须通过重写方法来确定方法的调用;
二、静态方法
静态方法属于接口本身,而不是实现类。静态方法可以直接通过接口名调用。
interface InterfaceName{
static returnType methodName(arg-list){
//代码实现
}
}
// 访问
InterfaceName.methodName();
三、私有方法
从Java 9开始,接口中还可以定义私有方法。
- 私有方法可以用于重用代码,避免重复实现逻辑。
- 私有方法只能在接口内部被调用,不能被实现类或其他外部类访问。
public interface MyInterface {
private void privateMethod() {
System.out.println("This is a private method.");
}
default void usePrivateMethod() {
privateMethod();
}
}