面试题答案
一键面试使用protected修饰符的场景
- 业务场景:当需要在继承体系内共享某些属性或方法,但不希望外部包的非子类访问时。例如,在一个图形绘制的Java项目中,有一个
Shape
基类,包含一些绘制相关的通用属性和方法,Circle
、Rectangle
等子类继承自Shape
。像Shape
类中一些用于计算图形基本参数(如面积计算的中间步骤方法),只希望子类能访问,而不希望外部无关类访问,就可以用protected
修饰。 - 好处:
- 代码复用:子类可以直接复用父类中
protected
修饰的属性和方法,避免重复编写代码,提高开发效率。 - 封装与安全:对外部包非子类隐藏了这些细节,保证了内部实现的安全性,避免无关类随意访问和修改。
- 代码复用:子类可以直接复用父类中
- 潜在问题:
- 继承体系维护成本:如果
protected
成员过多,可能会增加继承体系的维护成本。因为子类对这些成员有访问权限,可能会过度依赖父类的实现细节,当父类实现发生变化时,可能需要修改多个子类。 - 包外子类访问权限问题:虽然对包外非子类隐藏,但包外子类仍可访问,可能导致意外的访问,需要对包外子类开发者做好文档说明。
- 继承体系维护成本:如果
使用default修饰符的场景
- 业务场景:当希望在同一个包内的类之间共享某些属性或方法,但不需要通过继承关系来共享时。比如在一个电商项目的用户模块包中,有
User
类、UserService
类等,存在一些工具方法,如用户数据校验方法,这些方法只在本包内的类中使用,不需要在包外公开,就可以使用default
修饰。 - 好处:
- 包内代码组织:方便将一些包内通用的功能封装起来,提高包内代码的内聚性,使包内的类之间可以方便地复用这些方法,减少代码冗余。
- 访问控制适度:在包内提供了相对宽松的访问权限,同时又限制了包外访问,较好地平衡了代码复用和安全性。
- 潜在问题:
- 包内耦合度增加:如果
default
成员被包内过多类依赖,当这些成员发生变化时,可能需要修改包内多个类,增加了包内代码的耦合度和维护成本。 - 命名冲突:在包内不同类中,如果使用
default
修饰的方法命名相同,可能会导致命名冲突,需要在开发过程中特别注意命名规范。
- 包内耦合度增加:如果