编程Java开发人员

在Java中有哪些控制类成员可见性(访问控制)的方法,如何正确应用它们,以及在设计架构时需要注意哪些细节?

用 Hintsage AI 助手通过面试

答案。

在Java中,使用访问修饰符来控制对字段、方法和类的访问:privatedefault(包私有)、protectedpublic

问题的背景:

早期版本的Java使用严格的对象封装。为了灵活性,引入了不同的访问级别以支持完全封闭性和扩展性(继承和包内访问)。

问题:

不正确的修饰符选择可能会导致封装破坏、继承问题、无法测试,甚至是安全漏洞,如果数据错误地变为公共可访问。

解决方案:

使用最严格的修饰符,符合您的架构。字段通常设置为private,通过getter/setter提供访问。只有当方法是API的一部分时才设置为public,而对于扩展,应设置为protected

代码示例:

public class Person { private String name; // 私有字段 protected int age; // 在包和子类中可访问 String email; // 包私有 public String getName() { return name; } }

关键特点:

  • private — 仅在类内部可访问
  • 包私有(无修饰符)— 在同一包中的所有类都可以访问
  • protected — 额外允许其他包中的子类访问
  • public — 对所有人可访问

可能的陷阱问题。

可以对局部变量应用访问修饰符吗?

不可以。访问修饰符仅应用于类、方法和字段/内部类,而不适用于局部变量。

可以在方法内部创建带有public修饰符的类吗?

不可以。局部类不能声明访问修饰符,它总是具有方法内部的可见性。

protected成员在其他包中的子类中可访问吗?

可以,protected成员可以被子类访问,即使它们位于其他包中,但普通类在其他包中不可访问。

常见错误和反模式

  • 使用public字段(破坏封装)
  • “偶然”的包私有(被遗忘的修饰符)
  • 不必要地暴露protected方法
  • 滥用public静态字段在应用程序部分之间传递信息

实际示例

负面案例

类的所有字段偶然声明为public — 其他类直接访问,难以追踪更改位置。

优点:

  • 快速简单地访问数据

缺点:

  • 访问控制难度。没有检查/验证逻辑
  • 数据容易破坏

正面案例

所有字段都是private,公共方法控制带有验证的访问,仅将需要的部分设置为protected以便于子类扩展。

优点:

  • 安全性、控制性和可预测性
  • 架构灵活性

缺点:

  • 需要额外的方法(getter/setter)
  • 在快速原型开发时交互变得复杂