MENU

Java-44 对类中存在的多个同名结构的使用说明

October 18, 2023 • Read: 70 • Java阅读设置

学习接口后,需要特别注意的一点是,接口与类是同level的,也就是说,对一个类来说,接口与直接父类是同层的。

因此,存在访问同level的结构中的同名成员的情况,以下例子是其中一种情况:
接口A与类B中定义了同名属性,此时有类C继承类B且实现接口A,使用类C该属性时,需要注意:

  • 若C中也定义了该同名属性,根据使用优先级:不论存在多少同名结构,优先使用自己的,因此这时会直接使用自己的。
    2023-10-18T01:42:36.png
  • 若C中没有定义该同名属性,代表此时使用C中的该属性实际上是使用其父类中的或其接口中的,问题在于直接父类与接口同层,因此此时若仅使用属性名访问C中的该属性会出现编译错误,属于歧义的错误,因此这时访问C中的该属性要明确访问的是接口中的还是直接父类中的,分别对应super关键字和接口名.的方式,因为接口中的属性都是static final的。
    2023-10-18T01:45:58.png
    2023-10-18T01:46:18.png
    2023-10-18T01:46:39.png

总结下来,使用类中的多个同名结构遵循的原则是“就近”原则:

  • 自己的是最近的;
  • 直接父类的是比其他父类的近;
  • 父类与接口是同level的,接口与接口是同level的,同level的要明确区别开来使用,否则会出现歧义编译错误。

对于方法目前来说不存在同名同参方法冲突的问题,同level的同返回值的同名同参方法目前只可能存在于既实现接口又继承一个类(或者实现多个具有同名同参抽象方法的接口,本质都是抽象方法)这样的情况下,也就是直接父类和接口中存在同返回值同名同参的抽象方法,由于接口中的方法一定是抽象的,因此一定要重写该方法,也就一定会存在自己的该方法,优先使用自己的。

但对于方法,存在这种情况,直接父类中存在的与接口不同返回值但同名同参的抽象方法,此时不管怎样重写都只能重写一种同名同参方法,也就是说只能要么实现父类中的重写,要么实现接口中的重写,程序一定会报错,这时就需要修改直接父类中的抽象方法或接口中的抽象方法,使得该错误不存在。

还有一种特殊情况,C是包含抽象方法x的接口A的实现类,同时继承了包含与接口A中抽象方法x的同返回值的同名同参的非抽象方法的父类B,此时C中的父类继承来的x方法会直接自动作为C对A中抽象方法的重写方法。
这表明,继承的抽象方法要求的不是一定要重写,要求的本质是一定要有一个与该抽象方法对应的有具体内容的版本即可。
2023-10-18T02:00:13.png

Last Modified: October 20, 2023