接口的继承,字段 您所在的位置:网站首页 接口继承接口的意义 接口的继承,字段

接口的继承,字段

2024-07-15 20:28| 来源: 网络整理| 查看: 265

结论:

接口中的所有方法和字段,都是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();

​ 因为静态方法不存在继承,也就无需讨论覆盖的问题(自己的就是自己的)

在美团实习的时候,发现项目中有不少接口继承的情况,通过这次梳理一举弄清楚接口继承已经默认方法、静态方法的使用

image-20210823203616102

定义两个父接口:

这是一个最普通的接口,里面都是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 实验室设备网 版权所有