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() {

	}
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java Map接口及其实现类原理解析

    Map接口 Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value: Map中的键值对以Entry类型的对象实例形式存在: 建(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个建最多只能映射到一个值. Map支持泛型,形式如:Map<K,V> Map中使用put(K key,V value)方法添加 Map接口中定义的常用方法 具体使用在实现类中讨论 int size();//获取Ma

  • Java Iterator接口遍历单列集合迭代器原理详解

    这篇文章主要介绍了Java Iterator接口遍历单列集合迭代器原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Iterator接口概述 在程序开发中,经常需要遍历集合中的所有元素.针对这种需求,JDK专门提供了一个接口java.util.Iterator . Iterator 接口也是Java集合中的一员,但它与 Collection . Map 接口有所不同,Collection 接口与 Map 接口主要用于存储元素,而 Iter

  • Java抽象类与接口区别详解

    很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题.本文我们将仔细讨论这些话题. 在讨论它们之间的不同点之前,我们先看看抽象类.接口各自的特性. 抽象类 抽象类是用来捕捉子类的通用特性的 .它不能被实例化,只能被用作子类的超类.抽象类是被用来创建继承层级里子类的模板.以JDK中的GenericServlet为例: public abstract class GenericServlet implements Servlet, ServletC

  • Java基于rest assured实现接口测试过程解析

    背景 java程序员一般写的是后端服务是JavaWeb类型的项目,主要包括Http接口和dubbo接口,Http接口一般采用的rest风格,那么如何快速的对rest接口在第三方的测试框架上进行测试呢? rest-assured框架是一个不错的工具. 使用之前,需要熟悉一下最基础的使用方法,在写完几个接口的测试用例之后,好比你可以使用你的三棱军刺熟练的进行基础的攻击了. 快速的来一个hello world吧! 假设你写了一个接口:lotto,访问路径是: http://localhost:8080

  • Java框架MyBatis接口编程过程解析

    要求: 1.配置文件的namespace名称空间指定为接口的全类名 2.配置文件中的id唯一标识与接口中的方法对应(返回值类型对应,方法名对应,参数个数和类型对应) 接口代码: package com.bird.mybatis.dao; import com.bird.mybatis.bean.Employee; public interface EmployeeMapper { public Employee getEmpById(Integer id); } 对应配置文件代码: <?xml

  • Java获取接口所有实现类的方式详解

    有时候,根据业务逻辑的需求,我们想要获取到某个接口的所有实现类.在这里大致介绍两种方式: 1.借助Spring容器实现 Spring作为一个容器,管理着一个项目中所有经过配置的Java类(xml配置文件或Annotation方式).如果某个接口的所有实现类均被Spring托管了,那么通过Spring就可以很简单的返回这些实现类. import org.springframework.beans.BeansException; import org.springframework.context.

  • Java接口统一样式返回模板的实现

    前言 一开始,我们在写项目的时候,前端要什么数据,我们就返回什么数据,每个接口也都写得不一样很乱:随着前后端的分离:对于代码规范的要求也越来越严谨:接口都是统一样式的返回模板: 下面,接受一种我之前用过的返回模板: 一.首先来看下我们的Controller接口 /** * 获取用户信息 * @param token 微信登入者token * @param id 商品id * @return 商品详细信息 */ @PostMapping(value = "getUserInfo") @R

  • Java8接口默认静态方法及重复注解原理解析

    接口默认方法和静态方法 默认方法 interface MyInterface1 { default String method1() { return "myInterface1 default method"; } } class MyClass{ public String method1() { return "myClass method"; } } /** * 父类和接口中都有相同的方法,默认使用父类的方法,即类优先 * @author 莫雨朵 * */

  • Java8 接口默认方法和静态方法

    目录 1.默认接口方法 2.静态接口方法 3.两者的场景差异 前些日有同学问我Java接口中为什么要增加一个默认方法.在Java 8 中不单单增加了默认接口方法还增加了静态接口方法.今天就来聊聊这两个方法. 1.默认接口方法 java中的默认接口方法是这样定义的: public interface NewInterface { ​ void otherMethod(); default void doSomething() { System.out.println(" do something

  • Spring @Conditional注解原理解析

    这篇文章主要介绍了Spring @Conditional注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 @Conditional是Spring4新提供的注解,它的作用是根据某个条件加载特定的bean. 我们需要创建实现类来实现Condition接口,这是Condition的源码 public interface Condition { boolean matches(ConditionContext var1, AnnotatedT

  • spring @Component注解原理解析

    这篇文章主要介绍了spring @Component注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.@controller 控制器(注入服务) 2.@service 业务(注入dao) 3.@repository dao(实现dao访问) 4.@component (把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>) 5.@Comp

  • springboot @ComponentScan注解原理解析

    这篇文章主要介绍了springboot @ComponentScan注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 @ComponentScan 告诉Spring从哪里找到bean. 如果你的其他包都在@SpringBootApplication注解的启动类所在的包及其下级包,则你什么都不用做,SpringBoot会自动帮你把其他包都扫描了. 如果你有一些bean所在的包,不在启动类的包及其下级包,那么你需要手动加上@Compone

  • Spring @Primary和@Qualifier注解原理解析

    一 前言 本篇内容主要是讲解2个重要的注解使用方式和场景,@Primary,@Qualifier注解:其作用就是消除bean注入时的歧义,能够让spring容器知道加载哪个bean: 知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;) 二 实现方式 如下示例中使用被单接口Sheet, 实现类为SheetA , SHeetB ; 由于注入容器时都是 Sheet类型,会发生异常,此时就是使用@Pri

  • SpringData @Query和@Modifying注解原理解析

    @Query注解查询适用于所查询的数据无法通过关键字查询得到结果的查询.这种查询可以摆脱像关键字查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是Spring Data的特有实现. 索引参数与命名参数 1.索引参数如下所示,索引值从1开始,查询中"?X"个数需要与方法定义的参数个数相一致,并且顺序也要一致. @Query("SELECT p FROM Person p WHERE p.lastName = ?1 AND p.email = ?2")

  • Spring AspectJ AOP框架注解原理解析

    什么是AspectJ AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. AspectJ是一个基于Java语言的AOP框架 Spring2.0以后新增了对AspectJ切点表达式支持 @AspectJ 是AspectJ1.5新增功能,通过JDK5注解技术,允许直接在Bean类中定义切面 新版本Spring框架,建议使用AspectJ方式来开发AOP AspectJ表达式: 语法:exe

  • JAVA的LIST接口的REMOVE重载方法调用原理解析

    前言 说真的,平常看源码都是自己看完自己懂,很少有写出来的冲动. 但是在写算法的时候,经常用到java中各种集合,其中也比较常用到remove方法. remove有重载函数,分别传入参数是索引index或者数据Object(指定泛型后自动转换),如果指定泛型是其他数据类型还好,但是指定的是Integer或者是int的话,或者就有点懵了. 这曾经也困惑过我,所以我就唯有用实践解惑了. 测试类设计 测试类一 public class Text { public void remove(int ind

  • Java8新特性之重复注解与类型注解详解

    目录 Java8新特性重复注解与类型注解 一.JDK5中的注解 1.注解(@) 2.作用 3.如何理解注解? 4.关于注解 5.注解分为三个阶段 6.注解的属性类型 7.为注解增加属性 二.Java8中的注解 1.类型注解 2.重复注解 三.Java8对注解的增强 Java8新特性重复注解与类型注解 在Java8之前,在某个类或者方法,字段或者参数上标注注解时,同一个注解只能标注一次.但是在Java8中,新增了重复注解和类型注解,也就是说,从Java8开始,支持在某个类或者方法,字段或者参数上标

随机推荐