MST

星途 面试题库

面试题:Java多态下方法重写访问权限在复杂继承体系中的应用与优化

假设有一个多层继承体系,A类是顶层父类,B类继承A类,C类继承B类。A类中有一个方法m(),访问权限为包访问权限。B类重写m()方法,将访问权限提升为protected。C类再次重写m()方法,在遵循多态下方法重写访问权限规则的前提下,如何合理设置C类中m()方法的访问权限以优化代码的可维护性和扩展性?并结合实际场景说明不同访问权限设置对系统架构的影响。
23.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. C类中m()方法访问权限的设置
    • 根据多态下方法重写访问权限规则,子类重写方法的访问权限不能比父类被重写方法的访问权限更严格。由于B类中m()方法的访问权限是protected,所以C类中m()方法的访问权限可以是protected或者public
    • 从可维护性和扩展性角度考虑,建议设置为protected。这样设置的原因是,protected权限可以保证该方法在子类和同包内的其他类中可见。如果设置为public,虽然符合重写规则,但会使该方法的可访问范围更大,可能导致不必要的调用,增加代码维护的难度。在实际开发中,如果该方法只需要在继承体系内使用,protected权限更为合适,它明确了该方法的使用范围,有助于代码的理解和维护。
  2. 不同访问权限设置对系统架构的影响
    • 使用protected权限
      • 优点
        • 可维护性:明确限制了方法的访问范围,只有继承体系内和同包的类可以访问,减少了不必要的外部调用,使代码逻辑更加清晰。例如,在一个框架开发中,如果某个核心功能的扩展方法只希望框架内的子类或同包辅助类使用,protected权限能很好地实现这一目的,其他外部类无法随意调用,避免了误操作。
        • 扩展性:有利于子类继承和扩展。子类可以在不改变方法访问范围的情况下进一步重写该方法,增加功能。比如,在一个游戏开发框架中,有一个Character类(类似A类),PlayerCharacter类(类似B类)继承自Character类,MageCharacter类(类似C类)继承自PlayerCharacter类。Character类中的move()方法(类似m()方法)是包访问权限,PlayerCharacter类将其重写为protected权限,MageCharacter类再次重写时设置为protected权限。这样,MageCharacter类及其子类可以根据需要扩展move()方法,同时其他无关类无法直接调用,保证了架构的稳定性。
      • 缺点:在跨包使用时,可能需要通过一些中间类或接口来实现访问,稍微增加了代码复杂度。
    • 使用public权限
      • 优点
        • 可维护性:对于一些通用的、希望广泛被调用的方法,设置为public可以方便其他类直接调用,减少中间代理类的编写,在一些简单的工具类场景中比较实用。例如,一个通用的数学计算工具类MathUtils,其中的add()方法如果是public,其他类可以直接调用,代码简洁明了。
        • 扩展性:具有最大的扩展性,任何类都可以调用该方法,在一些需要高度开放接口的系统中很有用。比如,开发一个开放的SDK,提供给外部开发者使用,其中一些核心功能方法设置为public,方便外部开发者集成和使用。
      • 缺点
        • 可维护性:由于访问范围过大,可能会被随意调用,增加了代码的维护难度。如果方法内部实现发生改变,可能会影响到大量调用该方法的外部类,导致代码修改成本增加。
        • 扩展性:从继承体系角度看,子类可能会面临方法被外部过度依赖的问题,在子类重写方法时需要考虑对外部调用的影响,限制了子类扩展的灵活性。