接口默认方法和静态方法
默认方法
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() { } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Java8默认方法Default Methods原理及实例详解,包括了Java8默认方法Default Methods原理及实例详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java8默认方法Default Methods原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Java 8 引入了新的语言特性
为什么上面的代码有编译错误“java:default method equals in interface Table重写java.lang.Object的一个成员”?难道我们不能使用接口默认方法重写hashCode和equals方法吗?假设我在同一个接口中有方法来确定实现这个接口的对象的相等性?
本文向大家介绍Java8 Optional原理及用法解析,包括了Java8 Optional原理及用法解析的使用技巧和注意事项,需要的朋友参考一下 平时开发的工作中, 自己组内的很多大佬经常使用Optional的用法, 自己问他们, 这个到底有什么好处呢,他们说可以很好的规避好空指针的问题, 我们在平时写java代码的时候, 如果是一个新手, 肯定很多情况下都会出现空指针的报错, 而java8 以
问题内容: Java 8在接口上引入了默认方法和静态方法。因此,现在无论使用默认方法还是静态方法,您都可以在界面中实现具体的实现。 Java声称添加这两种新方法的原因是“确保与为那些接口的较旧版本编写的代码二进制兼容”。 我的问题: 为什么为了支持现有的体系结构问题而扭曲应该完全抽象的接口原始概念? 使用抽象类和新版本的接口之间的区别除了一个类具有扩展多个接口的能力之外,还有什么区别? 问题答案:
Java8在接口上引入了默认和静态方法。因此,现在您可以在接口中有具体的实现,不管是使用默认方法还是静态方法。 Java声称添加这两种新方法的原因是“确保与为这些接口的旧版本编写的代码的二进制兼容性”。 null
问题内容: 我们有一个给定的REST接口: 可以根据服务器配置,通过不同的逻辑“计算器”来实现此计算。 现在,我们正在设计每个计算器必须实现的Java接口。该接口将为每个REST服务提供一个方法。 鉴于所有REST(和HTTP)调用都是无状态的,因此每个方法都应该是静态的。但是,您不能在Java接口中定义静态方法。有没有针对这种情况的好的解决方法? 我们可以将这些方法定义为非静态方法,然后仅创建一
问题内容: 拥有具有默认方法的接口的动态代理,如何调用默认方法?通过使用类似的方法,您可以得到名为的代理调用处理程序(这在某种程度上是正确的,因为您没有为此接口实现的类)。 我有一个使用ASM来创建实现接口的类并将此类调用委派给此类实例的解决方法。但这不是一个好的解决方案,特别是如果默认方法调用其他接口方法(您将获得委托人乒乓球)。JLS对此问题出人意料地保持沉默… 这里是一个小代码示例: 问题答
当我注意到现在可以在接口中定义静态和默认方法时,我正在通过接口学习。 请解释两者的区别,如果有一个我们什么时候会使用它的例子,那就好了。界面上有点混乱。