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(){
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。