JDK1.8之前:接口类只能定义方法名,返回类型和参数列表,不能有方法体。接口提供了规范,就像肯德基一样,装修风格、产品都一样的,至于招几个员工、怎么经营都是加盟店说了算。
JDK1.8中使用两个新概念扩展了接口的含义:默认方法和静态方法,也就是说接口中可以有方法的具体实现。
(1)、静态方法使用关键字static来修饰方法,可以直接通过接口名调用。
interface Phone { static void makePhone(){ System.out.println("制造手机"); } } class XiaomiPhone implements Phone { @Override public void makePhone { System.out.println("制造小米手机"); } }(2)、默认方法
使用关键字default来修饰方法,默认方法通过对象实例来调用;默认方法使得开发者可以在不破坏二进制兼容性的前提下,往现存接口中添加新的方法,实现类不用强制性实现接口里的默认方法。
interface Phone { default void makePhone(){ System.out.println("制造手机"); } default void typePhone(){ System.out.println("手机类型"); } } class XiaomiPhone implements Phone { @Override public void typePhone{ System.out.println("小米手机"); } } public class Main { public static void main(String[] args) throws InterruptedException { XiaomiPhone myphone= new XiaomiPhone (); myphone.makePhone(); myphone.typePhone();//接口中的默认方法已经被覆盖 } }(3)、问题
接口的新特性可以实现多继承,但是同时也带来二义性问题。
例如:如果一个类同时实现了两个接口,这两个接口里面的有这相同名字的默认方法。这样的情况下,编译器会报错,因为调用这个方法时编译器不知道该调用哪个接口里面的方法,从而哪个都不选,而是在发现会继承多个默认方法实现并且没有重写时报错,逼使用户显式重写可能冲突的方法。
(4)、总结
- 接口中的抽象方法需要实现类来实现
- 在JDK1.8之后接口中新增加了静态方法(static)和默认方法(default)。使得接口中可以实现方法(可以写方法体)。
- 接口中的默认方法由实现对象来调用。
- 接口中的静态方法由接口.静态方法名的形式来调用。
- 接口不允许实例化对象,但是可以通过匿名实现类来实现。
- 接口实现了多继承,但是要注意避免二义性。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)