接口的继承,字段 | 您所在的位置:网站首页 › 接口继承接口的意义 › 接口的继承,字段 |
结论: 接口中的所有方法和字段,都是public 方法没有实现,则都是abstract;若想实现,则是default修饰 字段都是public static final类型的;静态方法则是public static 接口能够继承父类接口的abstract方法,且多个父接口存在重名的abstract方法,对于子接口没有影响,因为如果一个类去implements子接口,一定要实现abstract方法,这个时候并不用在意实现的是哪个父接口的abstract方法 如果父接口存在重名的方法,且有一个是default方法,则子接口一定要重写该方法,避免产生歧义 接口能够继承父接口的static属性,例如A接口定义了一个static属性color,B接口继承了A接口,那么可以这样使用该静态属性: A.color; B.color并且静态属性存在覆盖的情况,如果B接口中定义了与A接口同名的变量,那么B.color将会得到B自己定义的值 对于静态方法,则不存在继承的情况,例如A接口定义了一个static方法method(),B接口继承了A接口,使用情况如下: //只能够使用: A.method(); //不能够使用 B.method(); 因为静态方法不存在继承,也就无需讨论覆盖的问题(自己的就是自己的) 在美团实习的时候,发现项目中有不少接口继承的情况,通过这次梳理一举弄清楚接口继承已经默认方法、静态方法的使用 定义两个父接口: 这是一个最普通的接口,里面都是public abstract方法 public interface Car { void buyCar(); void driveCar(); void sell(); }这个接口特殊一点,里面除了有public abstract方法外,还有default和static方法,并且默认都是public的 可以发现,House接口中的默认方法sell()和Car接口中的sell()方法重名了 public interface House { default void buyHouse() { System.out.println("买房"); } void liveHouse(); default void sell() { System.out.println("卖房"); } static void houseTax() { System.out.println("交房产税"); } }再定义一个接口去多继承 这个接口必须要重写sell()方法,否则会报错 因为House中有一个sell()的默认方法,为了避免歧义(到底是继承的abstract方法,还是继承的default方法呢?),必须重写。如果两个父接口有同名的abstract方法,那么没有影响,因为类去implements的时候,必须重写,这个时候不用管到底重写的是哪个接口的方法了 public interface Human extends House, Car { @Override default void sell() { House.super.sell(); } }使用的是时候,有一点需要注意的是,House中有一个static方法,但是必须还是得指定House.houseTax()才行,用继承的子类声明,是不行的。类继承的时候,static方法和字段,也得整理一下 @Test public void test() { Human human = new HumanImpl(); human.buyCar(); human.buyHouse(); human.sell(); //static方法还是只能用House去声明 House.houseTax(); }接口中的字段,都是public static final类型的 public interface Car { public static final String brand = "benz"; public static final String country = "USA"; void buyCar(); void driveCar(); void sell(); default void showBrand() { System.out.println(brand); } }使用可以根据类名获取字段,也可以通过写默认方法来获取 同时,静态字段是继承的 @Test public void test1() { Human human = new HumanImpl(); human.showBrand(); System.out.println(Car.country); System.out.println(Car.brand); System.out.println(Human.brand); System.out.println(Human.country); } |
CopyRight 2018-2019 实验室设备网 版权所有 |