Java8接口默认静态方法及重复注解原理解析
接口默认方法和静态方法
默认方法
interface MyInterface1 { default String method1() { return "myInterface1 default method"; } } class MyClass{ public String method1() { return "myClass method"; } } /** * 父类和接口中都有相同的方法,默认使用父类的方法,即类优先 * @author 莫雨朵 * */ class MySubClass1 extends MyClass implements MyInterface1{ } @Test public void test1() { MySubClass1 mySubClass1=new MySubClass1(); System.out.println(mySubClass1.method1());//myClass method }
如果类的父类的方法和接口中方法名字相同且参数一致,子类还没有重写方法,那么默认使用父类的方法,即类优先
interface MyInterface1 { default String method1() { return "myInterface1 default method"; } } interface MyInterface2 { default String method1() { return "myInterface2 default method"; } } /** * 如果类实现的接口中有名字相同参数类型一致的默认方法,那么在类中必须重写 * @author 莫雨朵 * */ class MySubClass2 implements MyInterface1,MyInterface2{ @Override public String method1() { return MyInterface1.super.method1(); } } @Test public void test2() { MySubClass2 mySubClass2=new MySubClass2(); System.out.println(mySubClass2.method1());//myInterface1 default method }
如果类实现的接口中有名字相同参数类型一致的默认方法,那么在类中必须重写
静态方法
interface MyInterface1 { static String method2() { return "interface static method"; } } @Test public void test3() { System.out.println(MyInterface1.method2());//interface static method }
重复注解
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MAnnotation { String name() default ""; int age(); } public class AnnotataionTest { @Test public void test() throws Exception { Class<AnnotataionTest> clazz=AnnotataionTest.class; Method method = clazz.getMethod("good", null); MAnnotation annotation = method.getAnnotation(MAnnotation.class); System.out.println(annotation.name()+":"+annotation.age()); } @MAnnotation(name="tom",age=20) public void good() { } }
以前我们是这样使用注解,当要在一个方法上标注两个相同的注解时会报错,java8允许使用一个注解来存储注解,可以实现一个注解重复标注
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Repeatable(MAnnotations.class)//使用@Repeatable来标注存储注解的注解 public @interface MAnnotation { String name() default ""; int age(); } @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MAnnotations { MAnnotation[] value(); } public class AnnotataionTest { @Test public void test() throws Exception { Class<AnnotataionTest> clazz=AnnotataionTest.class; Method method = clazz.getMethod("good"); MAnnotation[] mAnnotations = method.getAnnotationsByType(MAnnotation.class); for (MAnnotation annotation : mAnnotations) { System.out.println(annotation.name()+":"+annotation.age()); } } @MAnnotation(name="tom",age=20) @MAnnotation(name="jack",age=25) public void good() { } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
Spring中的BeanFactory与FactoryBean区别详解
这篇文章主要介绍了Spring中的BeanFactory与FactoryBean区别详解,BeanFactory是一个接口,它是spring中的一个工厂,FactoryBean也是一个接口,实现了3个方法,通过重写其中方法自定义生成bean,需要的朋友可以参考下2024-01-01java中FileOutputStream中文乱码问题解决办法
这篇文章主要介绍了java中FileOutputStream中文乱码问题解决办法的相关资料,需要的朋友可以参考下2017-04-04Springboot自动配置与@Configuration配置类详解
这篇文章主要介绍了SpringBoot中的@Configuration与自动配置,在进行项目编写前,我们还需要知道一个东西,就是SpringBoot对我们的SpringMVC还做了哪些配置,包括如何扩展,如何定制,只有把这些都搞清楚了,我们在之后使用才会更加得心应手2022-07-07SpringBoot整合Web之CORS支持与配置类和 XML配置及注册拦截器
这篇文章主要介绍了SpringBoot整合Web开发中CORS支持与配置类和 XML配置及注册拦截器的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2022-08-08SpringCloud Config分布式配置中心使用教程介绍
springcloud config是一个解决分布式系统的配置管理方案。它包含了 client和server两个部分,server端提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client端通过接口获取数据、并依据此数据初始化自己的应用2022-12-12
最新评论