Java 8中允许接口中包含具有具体实现的方法,该方法称为默认方法
,默认方法使用 default
关键字修饰。
接口默认方法与静态方法
接口中的默认方法其实在一定程度上是违背了接口原本存在的意义。
一、默认方法
1、仅实现接口
// 接口
public interface MyInterface {
// 默认方法
default String getName() {
return "MyInterface接口的getName默认方法";
};
}
// 实现类,如果不重写getName方法,默认使用接口中的实现方式
public class MyInterfaceImp implements MyInterface{
}
public class InterfaceTest {
@Test
public void test1() {
MyInterface myInterface = new MyInterfaceImp();
System.out.println(myInterface.getName());
}
}
2、继承一个类并实现接口
若一个接口中定义了一个默认方法,而另外一个父类又定义了一个同名的方法时。如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。
public class ParentClass {
public String getName() {
return "父类中的同名方法!";
}
}
public class MyInterfaceImp extends ParentClass implements MyInterface{
}
3、实现两个接口
如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么必须覆盖
该方法来解决冲突。
public interface MyInterface1 {
default String getName() {
return "MyInterface2的getName默认方法!";
}
}
public class MyInterfaceImp implements MyInterface,MyInterface1{
// 重写MyInterface的getName方法
@Override
public String getName() {
return MyInterface.super.getName();
}
}
二、静态方法
Java8 中,接口中允许添加静态方法。
public interface MyInterface {
default String getName() {
return "MyInterface接口的getName默认方法";
};
static String getNickName() {
return "接口中的静态方法getNickName";
}
}
@Test
public void test2() {
System.out.println(MyInterface.getNickName());
}
重复注解与类型注解
Java 8对注解处理提供了两点改进:可重复的注解及可用于类型的注解。
一、重复注解
@Repeatable(MyAnnotation1.class) // 指定容器
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
// 默认值为lcy
String value() default "lcy";
}
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation1 {
MyAnnotation[] value();
}
public class TestAnnotation {
@MyAnnotation("Hello")
@MyAnnotation("World")
public void print() {
}
@Test
public void test() throws Exception{
Class<TestAnnotation> clazz = TestAnnotation.class;
Method print = clazz.getMethod("print");
MyAnnotation[] mas = print.getAnnotationsByType(MyAnnotation.class);
for(MyAnnotation an : mas) {
System.out.println(an.value());
}
}
}
二、类型注解
// MyAnnotation用在String类型前
public void show(@MyAnnotation String args) {
}