一.1.8之前的接口特性:
1.接口中的变量都是静态常量,必须显示初始化
2.接口中的所有方法默认都是public abstract,方法不能有方法体。
3.接口中没有构造方法,不可以被实例化,可以被实现
4.实现类必须实现接口的所有方法
5.实现类可以实现多个接口
二.1.8新增的新特性
1.接口里可以用default关键字修饰默认方法,方法可以有方法体。
public interface Test{ default void print(){ System.out.println("Test接口中的默认方法"); } }
一个类实现接口后,不必重写接口里的默认方法:
public class Put implements Test{ }
2.默认方法可以被继承,类的实例对象可以直接调用接口中的默认方法:
public static void main(String[] args) { Put put = new Put(); put.print(); }
3.如果一个类实现了多个接口,多个接口中都定义了一个相同方法名的默认方法,实现类需要重写接口中的默认方法。
接口Test,Test1中都定义了一个名为print的默认方法:
public class Put implements Test,Test1{ @Override public void print() { } }
可以在实现类中使用接口名.super.方法名调用不同接口中的相同默认方法。
public class Put implements Test,Test1{ public Put(){ Test.super.print(); Test1.super.print(); } @Override public void print() { } }
4.如果一个类继承了一个抽象类,实现了一个接口,抽象类和接口中存在相同的方法,采取类优先的原则,优先继承抽象类中的方法
抽象类superPut中定义一个print方法:
public abstract class superPut { public void print(){ System.out.println("superPut中的print方法"); } public abstract void a(); }
接口Test中定义一个print默认方法:
public interface Test{ default void print(){ System.out.println("Test接口中的默认方法"); } }
类Put继承抽象类,实现接口:
public class Put extends superPut implements Test{ public Put(){ } @Override public void a() { } }
实例化类Put,调用print方法
public static void main(String[] args) { Put put = new Put(); put.print(); }
从运行结果来看,优先调用抽象类中的方法。
5.接口中可以声明静态方法,可以为静态方法提供实现。接口中的静态方法必须是public的,public修饰符可以省略,静态方法不能被继承和覆盖,只能在其所在的接口被调用。