public Vs. private Keyword in Java

2025年3月26日 | 6分钟阅读

在 Java 中,publicprivate关键字,它们被称为访问修饰符或说明符。它们限制了类、构造函数变量方法和数据成员的范围或可访问性。这取决于它们应用于哪个。Java 提供了四种类型的访问修饰符:public、private、protecteddefault。但在本节中,我们将只讨论 public 和 private,并附带示例讨论 public 和 private 访问说明符之间的区别

在 Java 中,public 访问修饰符允许从任何其他类访问类、构造函数、方法和变量。它具有最广的范围,可以在同一包内的任何位置或任何其他包中访问。另一方面,private 访问修饰符仅限于在同一类内访问。它确保成员(方法、变量等)只能被同一类的其他成员访问。

访问修饰符控制其他类是否可以使用特定字段或调用特定方法。Java 提供了两个级别的访问控制:

  • 顶层:在此级别,我们只能使用 public
  • 成员级别:在此级别,我们可以使用 public、private、protected包私有(如果我们不使用显式修饰符,则称为包私有)。

下表显示了 public 和 private 修饰符允许的成员访问级别。

Public Vs Private Java

仍然不清楚两者之间的区别?让我向您展示一张图,它演示了访问级别如何影响可见性。下图显示了两个包 p1p2。每个包包含两个类 Demo1Demo2(在包 p1 中),以及 Demo3Demo4(在包 p2 中)。

Public Vs Private Java

下表描述了如果我们逐个使类成为 public 和 private,类的可见性。在上图中,Demo1 是唯一对所有访问修饰符都可见的类。

Public Vs Private Java

让我们详细讨论一下。

Public 访问修饰符

Java 中的顶级类可以被指定为 public,从而允许从程序中的任何其他类访问,无论它们是否在同一包中。此功能使其他程序组件可以轻松访问和使用类,这对于构建可重用组件或库特别有帮助。此外,为了方便在项目中查找和识别类,包含 public 类的 Java 文件名必须与 public 类的名称相对应。Public 成员可以被子类继承和覆盖,从而允许扩展和自定义功能。

让我们使用 private 访问说明符在Java 程序中更好地理解。

Demo1.java

Demo2.java

输出

Javatpoint

解释

提供的代码由两个 Java 类 Demo1 和 Demo2 组成,它们分别属于不同的包 p1 和 p2。Demo1.java 中的 public 类 Demo1 有一个 display() 方法,该方法将“Javatpoint”输出到控制台。由于 show() 方法是 public 的,因此该方法所在的类以外的类可以访问它。Demo2.java 中有一个名为 Demo2 的类,其中包含一个 main() 函数。在 main() 中创建了一个 Demo1 实例,并调用了它的 show() 函数。Demo1 的 public 访问限定符使其即使在不同包(p1)中也具有可访问性。这说明了 public 访问修饰符如何通过使成员跨包访问更容易来促进代码的模块化和可重用性。

Private 访问修饰符

它与 public 修饰符相反。可以通过使用 private 关键字后跟类名(仅应用于嵌套类)或方法名或数据成员来指定。我们不能将 private 访问说明符用于顶级类或接口。声明为 private 的变量、方法和类只能在声明它们的类中访问,或者通过继承父类来访问。它是 Java 中限制最严格的访问说明符。它是封装的最高形式。

Private 成员不能被继承或覆盖,从而加强了类本身内部实现细节的封装。私有构造函数限制了从类范围外部实例化类的能力。当希望在整个程序中只有一个类的实例时,例如单例模式,通常会采用这种方法来设计模式。由于其他类无法直接创建类的实例,因此当构造函数私有时,会坚持单例要求。

此外,由于它们可以防止意外实例化并鼓励使用静态方法进行功能访问,因此在实例化不必要或不希望发生时,可以在实用类中使用私有构造函数。

  • 我们不能覆盖声明为 private 的方法。
  • 如果我们使用 private 修饰符处理构造函数,我们可以避免它被子类化。
  • 它会隐藏同一内的其他类。

让我们使用 private 访问说明符在 Java 程序中更好地理解。

在下面的示例中,我们声明了两个类:Demo1 和 Demo2。在 Demo1 类中,我们将 show() 方法声明为 private。Demo2 类包含 main() 方法,我们在其中创建了 Demo1 类的对象。之后,我们尝试从 Demo2 类访问 Demo1 类的私有方法,这是不可能的。但我们仍然会执行程序来看它会显示什么错误。

Demo2.java

输出

Public Vs Private Java

Java 中 Public 和 Private 访问说明符的区别

方面Public 访问说明符 Private访问说明符
范围范围最广,可在程序中的任何地方访问。范围最受限制,仅在同一类中可访问。
可访问性可从任何其他类访问。仅在同一类中可访问。
封装可能导致违反封装原则。通过隐藏实现细节来支持封装。
继承和覆盖子类可以继承和覆盖。子类不能继承或覆盖。
用途通常用于需要广泛访问的方法和变量。用于内部方法和变量,促进数据隐藏。

public 和 private 修饰符之间的主要区别在于它们的可见性。Java 将类成员的可见性分为以下几类:

  • 同一包中的子类:具有 protected 或 default(包私有)访问修饰符的成员对同一包中的子类可见。
  • 同一包中的非子类:default(包私有)访问修饰符的成员对同一包中的所有类可见,无论它们是否是子类。
  • 不同包中的子类:protected 访问修饰符的成员对子类可见,即使它们位于不同的包中。
  • 不属于同一包也不属于子类的类:public 访问修饰符的成员对所有类可见,无论它们的位置或继承关系如何。
Public Vs Private Java

我们应该使用哪一个?

如果我们希望方法或属性从任何地方可见,包括其他类和对象实例,我们应该使用 public 访问修饰符。如果我们希望方法或属性仅在其自身类中可见,则使用 private 访问修饰符。除了常量之外,避免使用 public 字段。

选择 public 和 private 访问修饰符取决于类内或类之间方法和属性的预期可见性和用法。

  1. 使用 public:当我们希望一个方法或属性可以从任何地方访问时,包括其他类和对象实例。它促进了可重用性和模块化。
  2. 使用 private:当我们希望将对一个方法或属性的访问限制在其自身的类中时。它通过隐藏实现细节和保护类数据完整性来支持封装。

结论

总之,构建可靠且可维护的软件系统需要了解 Java 中 public 和 private 访问修饰符之间的区别。Public 访问鼓励了广泛的可访问性,使得代码重用以及包和类的兼容性更加容易。然而,如果应用不当,可能会导致封装违反。相反,Private 访问提供了对可访问性的严格控制,将用户限制在声明它们的类中,并保护了实现细节。

通过使用 private 访问,开发人员可以强制执行封装,阻止未经授权的访问或更改,并鼓励更清晰、更模块化的代码。访问修饰符的有效使用对于开发组织良好且可扩展的 Java 应用程序至关重要,同时考虑可见性、继承和封装等方面。