java8接口默认方法静态方法和重复注解

Wesley13
• 阅读 612

接口默认方法和静态方法

默认方法

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() {
        
    }
}
点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java8中的接口与时间操作
java8中接口可以有默认方法(用default修饰,可以有多个)和静态方法了。publicinterfaceTran{defaultpublicStringgetName(){return"zhangsan";}d
Wesley13 Wesley13
3年前
Java8 默认方法 default method
Java8引入了新的语言特性——默认方法(DefaultMethods)。Defaultmethodsenablenewfunctionalitytobeaddedtotheinterfacesoflibrariesandensurebinarycompatibilitywithcodewritte
Stella981 Stella981
3年前
Kotlin中类似java的静态方法
在java中,我们在写一些静态方法时会这样写:publicclassUtils{publicstaticStringgetName(){return"yiifox";}}在Kotlin中没有静态方法一说,网上大多说使用伴生对象来模拟静态方法,其实这种
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
Java8之Stream
在使用Stream之前先介绍几个概念:1、函数式接口2、常用的函数式接口3、Lambda4、方法引用 1、函数式接口  1.只定义了一个抽象方法的接口。  2.JDK8接口中的静态方法和默认方法,都不算是抽象方法。  3.接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,
Wesley13 Wesley13
3年前
Java 接口基础详解
目录Java接口示例实现一个接口接口实例实现多个接口方法签名重叠接口变量接口方法接口默认方法接口与继承继承与默认方法接口与多态性在Java中,接口是一个抽象类型,有点类似于类,但Java接口只能包含方法签名与属性,
Stella981 Stella981
3年前
Learning Java7 WatchService
WatchService直接映射到nativefileeventnotificationmechanism,如果原生文件时间通知机制不可用,默认实现就会使用polling方式。1\.JDK的实现风格,java.nio.file.Path接口对应一个java.nio.file.Paths静态方法工具类。Path接口定义了registe
Wesley13 Wesley13
3年前
Java 8 接口里的默认方法特性研究
这篇文章我们将要探讨Java 8中接口里的默认方法特性。Java8指出“默认方法使得新功能被添加到库中的接口里面,同时又能保证与这些接口老版本代码的二进制兼容性。这些年Java进化升级了很多,在Java库中引入的接口需要添加新的功能。在没有默认方法特性时,当你往接口中添加新方法时,接口内部所有实现的类都要历经一些修改。这将导致上千行的代码修改工作量。为了
桥蕤 桥蕤
7个月前
Python类方法,静态方法和实例方法
类的方法可分为类方法,静态方法和实例方法;这样的分类可以让代码开发更加的简洁明了,观看代码更有层次感,方便日后的维护工作;一个类对象的行为即是该类的方法,类中的方法一般格式如下:pythonclass类名(参数):def方法名(参数):...1.类方法类方