【Java基础】Java8新特性—接口中使用default和static关键字


接口中的变量默认类型是public static final,也是就是说是 公有静态常量 。 而方法默认是public abstract公有抽象方法,但是事实真的是这样吗?

一.新特性

Java 1.8对接口有两个方面的增强:接口中可以添加使用default或者static修饰的方法

  1. 增加default方法:又叫做接口扩展方法,即在不破坏java现有实现架构的情况下能往接口里增加新方法, default关键字可以给接口添加一个非抽象的方法实现,子类可以直接调用!

    如果想对接口增加一个新方法,那么需要对实现该接口的所有类进行修改,如果接口实的现类很多,就会带来很大的工作量,而且还很容易破坏以前的代码,带来一些问题。如果把新的方法定义为default方法,就可以避免对其他实现类的修改。尽管如此,Default 方法不适合过多使用

  2. 增加static方法: 接口中用static修饰的方法也可以有方法体,和类的静态方法一样,可以通过 接口名.方法名 进行接口中 static方法的调用。

二.defalut方法

  1. 实现类会继承接口中的default方法

如果接口A中有default方法:

public interface A {
	public default void a(){
		System.out.println("这是AAA");
	}
}

B类实现接口A:

public class B implements A{
	
}

那么B类将会继承接口A中的a方法:

public class Main {
	public static void main(String[] args) {
		B b = new B();
		b.a();
	}
}

执行结果:
在这里插入图片描述

  1. 如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法

为什么要重写呢?是因为,类在继承接口中的default方法时,不知道应该继承哪一个接口中的default方法。

接口A:

public interface A {
	public default void a(){
		System.out.println("这是A");
	}
}

接口B:

public interface B {
	public default void a(){
		System.out.println("这是B");
	}
}

Test类:
在这里插入图片描述

com.demo.test.Test inherits unrelated defaults for a() from types com.demo.test.A and com.demo.test.B

可以看出,接口的实现类可以直接调用接口中用default修饰的方法,并且不需要实现该方法(也可以实现)

  1. 如果子类继承父类,父类中有a方法,该子类同时实现的接口中也有a方法(被default修饰),那么子类会继承父类的a方法而不是继承接口中的a方法

接口A:

public interface A {
	public default void a(){
		System.out.println("AAA");
	}
}

类B:

public class B {
	public void a(){
		System.out.println("BBB");
	}
}

子类C:

public class C extends B implements A{
	public static void main(String[] args) {
          C c = new C();
          c.a();
    }
}

执行结果:
在这里插入图片描述
说明子类继承的b方法为父类C中的b方法,不是接口中的default b(){}方法。

三.static方法

static关键字常用于修饰类的属性和方法,同样,在Java8,static也可以修饰接口的方法

接口A:

public interface A {
	public static void a(){
		System.out.println("AAA");
	}
}

调用接口A的静态方法:

public class B {
    public static void main(String[] args) {
            A.a();
    }
}

执行结果:
在这里插入图片描述
可以看出,在接口中用static修饰的方法,可以直接用接口名.方法名(这里A.a())调用,并且实现类不能实现接口中static修饰的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章