[Java8新特性]:接口中的默认方法与静态方法
接口中的默认方法与静态方法
(1)、接口中的默认方法
Java8中允许接口中包含具有具体实现的方法,该方法称为“默认方法”(也称为扩展方法或虚拟扩展方法或防护方法),默认方法使用 default 关键字修饰,它的使用方式类似于抽象类中非抽象成员方法。
扩展方法不能够重写Object 中的方法,却可以重载Object 中的方法。
默认方法允许我们在接口里添加新的方法,而不会破坏实现这个接口的已有类的兼容性,也就是说不会强迫实现接口的类实现默认方法。
默认方法和抽象方法的区别是抽象方法必须要被实现,默认方法不是。作为替代方式,接口可以提供一个默认的方法实现,所有这个接口的实现类都会通过继承得到这个方法
例如:
interface MyInterface{
default String getString(){
return "Hello World!";
}
}
(2)、接口默认方法的 ” 类优先 ” 原则
若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。
接口冲突。如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么必须覆盖该方法来解决冲突。
public class Demo8 {
@Test
public void Test(){
MyClasss m = new MyClasss();//父类与父接口均提供某方法,采用父类方法
System.out.println(m.getString());//Hello Java!
MyClasss m2 = new MyClasss();//接口冲突需要指定
System.out.println(m2.getString());
}
}
class MyClass{
public String getString(){
return "Hello Java!";
}
}
interface MyInterfaces{
default String getString(){
return "Hello World!";
}
}
interface MyInterfaces2{
default String getString(){
return "Hello BigData!";
}
}
class MyClasss extends MyClass implements MyInterfaces{
}
class MyClassss implements MyInterfaces,MyInterfaces2{
@Override
public String getString() {
return MyInterfaces2.super.getString();
}
}
(3)、接口中的静态方法
Java8中,接口中允许添加静态方法。
public class Demo9 {
@Test
public void Test01(){
Inter.Show();
}
}
interface Inter{
static void Show(){
System.out.println("呵呵!");
}
}