java8后允许在接口中定义默认方法和静态方法,具体实现见下文。
1、接口中默认方法创建和使用
默认方法使用 default 修饰符在方法前进行修饰。
package com.my.inter;
public interface MyInterface {
//这是接口中的默认方法
default String getString(){
return "I'm interface inner function";
}
}
我们创建一个实现该接口的类:
package com.my.inter;
public class ImpClass implements MyInterface{
}
使用Junit Test来做测试:
package com.my.inter;
public class Test {
@org.junit.Test
public void test(){
ImpClass cls = new ImpClass();
System.out.println(cls.getString());
}
}
运行测试,获得如下结果:
可以看出实现了MyInterface的ImpClass的实例能够正常调用接口中的默认方法。
2、类优先原则
当实现接口类与接口中的默认方法一致时,将采用“类优先”原则,选择类中的方法,而不会使用接口中定义的默认方法。
接口文件与上节一致:
package com.my.inter;
public interface MyInterface {
//这是接口中的默认方法
default String getString(){
return "I'm interface inner function";
}
}
我们创建一个实现该接口的类,且类中的方法与接口方法名及结构一致:
package com.my.inter;
public class ImpClass implements MyInterface{
//这是实现类中的默认方法
public String getString() {
return "I'm class inner function";
}
}
使用Junit Test来做测试:
package com.my.inter;
public class Test {
@org.junit.Test
public void test(){
ImpClass cls = new ImpClass();
System.out.println(cls.getString());
}
}
运行测试,获得如下结果:
3、子类同时继承父类和接口同名方法
接口文件内容不变:
package com.my.inter;
public interface MyInterface {
//这是接口中的默认方法
default String getString(){
return "I'm interface inner function";
}
}
父类存在于接口同名的方法:
package com.my.inter;
public class MyClass {
public String getString() {
return "I'm MyClass inner function";
}
}
子类同时继承父类和接口:
package com.my.inter;
public class ImpClass extends MyClass implements MyInterface{
}
使用Junit Test来做测试:
package com.my.inter;
public class Test {
@org.junit.Test
public void test(){
ImpClass cls = new ImpClass();
System.out.println(cls.getString());
}
}
运行测试,获得如下结果:
当子类同时继承接口和父类的同名方法时,默认会调用父类中的同名方法,依然保持“类”优先的原则。
4、子类同时继承父类和接口同名方法,且子类也拥有同名方法
接口文件内容不变:
package com.my.inter;
public interface MyInterface {
//这是接口中的默认方法
default String getString(){
return "I'm interface inner function";
}
}
父类存在于接口同名的方法:
package com.my.inter;
public class MyClass {
public String getString() {
return "I'm MyClass inner function";
}
}
子类同时继承父类和接口,并自身存在于父类和接口同名的方法:
package com.my.inter;
public class ImpClass extends MyClass implements MyInterface{
public String getString() {
return "I'm ImpClass inner function";
}
}
使用Junit Test来做测试:
package com.my.inter;
public class Test {
@org.junit.Test
public void test(){
ImpClass cls = new ImpClass();
System.out.println(cls.getString());
}
}
运行测试,获得如下结果:
当子类同时继承接口和父类的同名方法,且子类也拥有同名方法时,默认会调用子类本身的方法,以接近原则进行调用。
5、实现多个拥有同名方法的接口
接口1:
package com.my.inter;
public interface MyInterface1 {
//这是接口1中的默认方法
default String getString(){
return "I'm interface1 inner function";
}
}
接口2:
package com.my.inter;
public interface MyInterface2 {
//这是接口2中的默认方法
default String getString(){
return "I'm interface2 inner function";
}
}
类同时实现接口1和接口2情况,方法必须重写,在重写时需要指明具体实现哪个接口的方法,写法如下:
package com.my.inter;
public class ImpClass implements MyInterface1 ,MyInterface2{
@Override
public String getString() {
return MyInterface2.super.getString();
}
}
以上使用**MyInterface2.super.getString()**来说明使用具体接口的方法。
6、接口中静态方法创建和使用
在接口中定义静态方法和在类中定义静态方法的方式一致,使用关键字static进行方法修饰。
接口文件如下:
package com.my.inter;
public interface MyInterface {
//这是接口中的静态方法
public static void print(){
System.out.println("I'm interface static function");
}
}
在使用时直接使用“接口名.静态方法名”的方式直接调用:
package com.my.inter;
public class Test {
@org.junit.Test
public void test(){
MyInterface.print();
}
}
运行测试,获得如下结果: