Java8接口默认静态方法及重复注解原理解析
接口默认方法和静态方法
默认方法
interfaceMyInterface1{ defaultStringmethod1(){ return"myInterface1defaultmethod"; } } classMyClass{ publicStringmethod1(){ return"myClassmethod"; } } /** *父类和接口中都有相同的方法,默认使用父类的方法,即类优先 *@author莫雨朵 * */ classMySubClass1extendsMyClassimplementsMyInterface1{ } @Test publicvoidtest1(){ MySubClass1mySubClass1=newMySubClass1(); System.out.println(mySubClass1.method1());//myClassmethod }
如果类的父类的方法和接口中方法名字相同且参数一致,子类还没有重写方法,那么默认使用父类的方法,即类优先
interfaceMyInterface1{ defaultStringmethod1(){ return"myInterface1defaultmethod"; } } interfaceMyInterface2{ defaultStringmethod1(){ return"myInterface2defaultmethod"; } } /** *如果类实现的接口中有名字相同参数类型一致的默认方法,那么在类中必须重写 *@author莫雨朵 * */ classMySubClass2implementsMyInterface1,MyInterface2{ @Override publicStringmethod1(){ returnMyInterface1.super.method1(); } } @Test publicvoidtest2(){ MySubClass2mySubClass2=newMySubClass2(); System.out.println(mySubClass2.method1());//myInterface1defaultmethod }
如果类实现的接口中有名字相同参数类型一致的默认方法,那么在类中必须重写
静态方法
interfaceMyInterface1{ staticStringmethod2(){ return"interfacestaticmethod"; } } @Test publicvoidtest3(){ System.out.println(MyInterface1.method2());//interfacestaticmethod }
重复注解
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public@interfaceMAnnotation{ Stringname()default""; intage(); } publicclassAnnotataionTest{ @Test publicvoidtest()throwsException{ Classclazz=AnnotataionTest.class; Methodmethod=clazz.getMethod("good",null); MAnnotationannotation=method.getAnnotation(MAnnotation.class); System.out.println(annotation.name()+":"+annotation.age()); } @MAnnotation(name="tom",age=20) publicvoidgood(){ } }
以前我们是这样使用注解,当要在一个方法上标注两个相同的注解时会报错,java8允许使用一个注解来存储注解,可以实现一个注解重复标注
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Repeatable(MAnnotations.class)//使用@Repeatable来标注存储注解的注解 public@interfaceMAnnotation{ Stringname()default""; intage(); } @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public@interfaceMAnnotations{ MAnnotation[]value(); } publicclassAnnotataionTest{ @Test publicvoidtest()throwsException{ Classclazz=AnnotataionTest.class; Methodmethod=clazz.getMethod("good"); MAnnotation[]mAnnotations=method.getAnnotationsByType(MAnnotation.class); for(MAnnotationannotation:mAnnotations){ System.out.println(annotation.name()+":"+annotation.age()); } } @MAnnotation(name="tom",age=20) @MAnnotation(name="jack",age=25) publicvoidgood(){ } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。