赞
踩
java8在接口中引入了默认方法,通过在方法前加上default关键字就可以在接口中写方法的默认实现,有点类似于C++中的多继承,但是当多个接口或父类中有相同签名的方法时,会引发一些问题,经过实验得出如下结论:
规则如下:
1.超类优先,如果超类提供了一个具体的方法,同名而且有相同的参数类型的默认方法会被忽略。
2.接口冲突。如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型(不论是否是默认参数)相同的方法,必须覆盖这个方法来解决。
1.当继承的父类和实现的接口中有相同签名的方法时,优先使用父类的方法。(超类优先原则)
- public class SubClass extends MyClass implements MyInterface{
-
- }
- public interface MyInterface {
-
- default String getName(){
- return "我是父类接口";
- }
-
- }
- public class MyClass {
-
- public String getName(){
- return "子类";
- }
-
- }
- SubClass subClass=new SubClass();
-
- System.out.println( subClass.getName());
- 子类
2.当实现的多个接口中有相同签名的方法(不论是否是默认参数)时,必须在实现类中通过重写方法解决冲突问题,否者无法通过编译,在重写的方法中可以通过 接口名.super.方法名(); 的方式显示调用需要的方法。(接口冲突)
- public class SubClass implements MyFun, MyInterface{
-
- @Override
- public String getName() {
- return MyInterface.super.getName();
- }
-
- }
- public interface MyFun {
-
- default String getName(){
- return "哈哈哈";
- }
-
- }
- public interface MyInterface {
-
- default String getName(){
- return "我是父类接口";
- }
- }
2.接口中的静态方法
- public interface MyInterface {
-
- default String getName(){
- return "我是父类接口";
- }
-
- public static void show(){
- System.out.println("接口中的静态方法");
- }
-
- }
MyInterface.show();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。