对于接口我们都很熟悉,关于接口的的特性我们也是耳熟能详
- 接口中的属性默认使用public static final 修饰
- 接口中的方法默认使用public abstract 修饰
- 接口可以多继承
但是在java8中,由于Lamada表达式的出现,接口这一类出现了巨大的变化
首先由于Lamada表达式的出现,一些接口中多出了很多要适应它的方法,这样就会导致从前实现这些接口的实现类都需要重写,为了更加方便的解决这一问题,java8在接口中添加了default修饰的默认方法。这个方法的声明方式如下:
public interface Note{
public abstract void print();
default void dprint(){
System.out.println("接口中的默认方法");
}
}
注意:由于这个方法时普通方法,所以不能加abstarct修饰
这个方法默认存在接口中,实现类可以不必重写,当使用接口的对象调用的时候,会直接调用接口中的这个方法
public class Realize implements Note {
@Override
public void print() {
System.out.println("实现类中的方法");
}
}
public class Test {
public static void main(String[] args) {
Note n = new Realize();
n.print();//会输出实现类的方法
n.dprint();//会输出接口中的方法
}
}
运行结果:
实现类中的方法
接口中的默认方法
default修饰的默认方法重写和其他抽象方法重写的方式相同
public class Realize implements Note {
@Override
public void print() {
System.out.println("实现类中的方法");
}
@Override
public void dprint(){
System.out.println("实现类中重写的默认方法");
}
}
继续运行Test.main()方法,结果为:
实现类中的方法
实现类中重写的默认方法
同时,java8中,接口中也可以定义静态方法
public interface Note{
static void method(){
System.out.println("接口中的静态方法");
}
public abstract void print();
default void dprint(){
System.out.println("接口中的默认方法");
}
}
但是静态方法的重写是无意义的,这一点就不必赘述了
即使实现类中重写了接口的静态方法,当接口对象指向实现类时,接口对象调用的仍然是自己的静态方法,而不是实现类的
无法构成多态的重写,也就没有必要重写了
public class Realize implements Note {
@Override
public void print() {
System.out.println("实现类中的方法");
}
// @Override //写与接口同名的静态方法,编译器不认为是重写,加Override注解报错
public static void method(){
System.out.println("123");
}
@Override
public void dprint(){
System.out.println("实现类中重写的默认方法");
}
}
public class Test {
public static void main(String[] args) {
Note n = new Realize();
//接口指向实现类,与父引用指向子类类似
n.print();//会输出实现类的方法
//接口中的静态方法,可以直接通过接口调用
Note.method();
n.dprint();
}
}
结果为:
实现类中的方法
接口中的静态方法
实现类中重写的默认方法
注意: 写与接口同名的静态方法,编译器不认为是重写,加Override注解报错。