环境:
java version "13.0.1" 2019-10-15
Java(TM) SE Runtime Environment (build 13.0.1+9)
今天在学习 Spring5 注解,想通过自定义的方式想 IOC 容器中加载类,其中一种方法为 用类实现 ImportBeanDefinitionRegistrar 接口,但是实现该接口后并未提示实现接口方法。
ImportBeanDefinitionRegistrar中定义了两个方法:
default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,BeanNameGenerator importBeanNameGenerator)
default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry)
方法用 default 修饰,因此简单学习了下 default 修饰
1.在java8以后,接口中可以添加使用default修饰的方法,default修饰方法只能在接口中使用,在接口中被default标记的方法为普通方法,可以直接写方法体。
因此实现类可以直接使用接口中的方法。
public interface A { public default void a(){ System.out.println("This is Interface A.a()"); } } public class B implements A{ } public class Test { public static void main(String[] args) { B b = new B(); b.a(); } }
2.如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法。因为,此时实现类不知道应该继承哪一个接口中的default方法。
public interface A { public default void a(){ System.out.println("This is Interface A.a()"); } } public interface C { public default void a(){ System.out.println("This is Interface C.a()"); } } public class B implements A,C { }
如以上代码,Idea会提示 :inherits unrelated defaults for a() from types A and C
所以说需要修改为:
public class B implements A,C { @Override public void a() { System.out.println("This is Interface C.a()"); } }
当类实例化时,会调用实现类当方法。
3.如果再有类分别继承实现类 和 实现接口,会调用实现类方法
public class D extends B implements A{ } public class Test { public static void main(String[] args) { D d = new D(); d.a(); } }
This is Class B.a()