【问题标题】:What does it mean for a method to be public/private/other in java? [closed]java中的方法是public/private/other是什么意思? [关闭]
【发布时间】:2025-11-30 14:30:02
【问题描述】:

java中的方法是public/private/other是什么意思?
这些选项的优缺点是什么?
作为一个试图成为一名优秀程序员的人,我关心的动力是什么?

【问题讨论】:

标签: java methods


【解决方案1】:

当一个方法是public时,意味着它可以被其他对象访问

例如:

class David {
     // public method, can be use by anyone
     public String getName() {
         return "David";
      }
 }

方法getName可以被其他类访问,因为它是公共的:

 class Other  {
      David davidOne = new David();
      String davidsName = davidOne.getName(); //<-- compiles and runs
 }

优势..你可以在其他地方使用它。

当一个方法是private时,意味着它只能被OF THE SAME CLASS的对象访问

例如,在这个新定义中:

class David {
     public String getName() {
         return "David";
     }
     // private method... nobody but David's "instances" can use it.. 
     private int getAge() {
         return 19;
     } 

 }

方法getAge不能被其他类访问,因为它是私有的,如果你尝试这样做,编译器会给你一个错误信息:

 class Other  {
      David davidOne = new David();
      String davidsName = davidOne.getName(); 
      int davidsAge = davidOne.getAge(); //<-- Compiler error, getAge() is not visible
 }

但是,如果您可以在 David 类中使用它:

class David {
     public String getName() {
         return "David";
     }
     // private method... nobody but David's "instance" can use it.. 
     private int getAge() {
         return 19;
     } 
     // Here the call to "getAge()" will succeed, because it is visible 
     // inside the class 
     public boolean hasSameAgeAs( David otherDavid ) {
         return this.getAge() == otherDavid.getAge();
     }
 }

优势?您可以创建一堆方法并将它们保密,避免数据损坏或一般保留您的对象encapsulated

关于封装

OOP(面向对象编程)的目的是根据现实生活中的对象对软件进行建模。

现实生活中的对象具有(除其他外)属性和访问这些属性的方法。

您希望公开其中一些方法,而将其他方法保密。

例如,一个人类存在,有一颗心。但它不是暴露给所有人的,这将是危险的。它被封装在我们体内。

如果我们要以真正的人类为软件建模,我们可以声明方法:heartBeat 为私有(因此,没有人可以访问它)

另一方面,使用像getGender 这样的public 方法来确定您的Human 实例是男性还是女性会很有用。

还有其他访问修饰符,例如:“protected”和包保护(没有关键字)

 class David {
      // protected method
      protected int getBalance() { 
          return 1000000; 
      }
      // package protected or "default" method
      boolean knowsOop(){ 
          return true;
      }
 }

getBalance 方法只能被David 实例和David 子类访问(为子类创建另一个线程)

方法knowsOop 可以被David 定义的包内的任何人访问。

不要担心这两个访问修饰符,当您了解更多有关 OOP 和 Java 的知识时,它们会很有意义。

最后,你真的应该花时间阅读:

http://java.sun.com/docs/books/tutorial/java/javaOO/index.html

希望对你有帮助

【讨论】:

    【解决方案2】:

    公共方法可以从任何地方访问,私有方法只能从同一个类访问。主要优点是对类的 API 的控制。如果我只公开需要的内容,我可以更改一个类的内部行为,而不会根据这个类破坏代码。您应该关心,因为软件在现实世界中经常更改(至少这是我的经验,其他人也有),每次更改中断的次数越多,您在维护上投入的精力就越多,或者您的软件存在的错误就越多。归根结底是成本问题。

    向此类的用户隐藏您的类的内部结构以避免后续更改破坏代码的可能性通常称为封装或information hiding

    除了 public 和 private 之外的两个选项是 package(没有修饰符)和 protected。 package-accessible 方法也可以从同一个包的类中访问。我不记得以任何有用的方式使用该选项。可以从继承相关类的类中访问受保护的方法。这通常用于为已定义的基类 API 创建具有具体行为的类。例如,您可以通过扩展 AbstractList 来实现一个新的 List 类,并且您只需要实现 get 和 size(以及一个用于可修改列表的 set 方法)。 List 的 API 暴露的其他方法在基类中定义,需要时调用其他三个方法。

    【讨论】:

      【解决方案3】:

      Private 方法只能在类内部调用。你可以在程序的任何地方调用你的类的public方法。没有访问修饰符的方法意味着具有包可见性范围(称为 default),因此您可以在包中定义类的任何位置调用它。

      http://en.wikipedia.org/wiki/Object_oriented_programming#Encapsulation

      【讨论】:

      • 我的动力是什么让一个方法只能在类内部调用?
      • 有时你有一个只需要在类中的方法。它可以是一些转换函数或任何其他补充代码。
      • 在该公共方法本身的主体中实现通过公共方法公开的功能并不总是可取的。公共方法可能必须调用其他方法来执行其行为。因此,这些其他方法仅供内部使用,应标记为私有。
      【解决方案4】:

      Hpublic、protected 和 private 修饰符控制其他代码可以看到这些方法(或字段)。这是关于控制你暴露的界面。

      常用的有:

      public 修饰符:任何其他人都可以看到你的方法。

      private 修饰符:除了你的类和任何内部类之外,没有其他代码可以看到你的方法。

      例如,如果您想确保只创建一个类的单个实例 (singleton pattern),这些将很有用。您可以将构造函数设为私有,创建单个实例并将存储为称为实例的私有成员,并提供类似这样的公共方法:

      public static MyObject getInstance() {
        return instance;
      }
      

      因此您可以保证每个实例都只有一个。


      更新 - 请求的另一个示例。

      另一个例子可能是你有一个复杂的公共方法,你想把它分解成更简单的部分。您可以将其分解为 simplr 方法,每个方法都完成部分工作,但您不希望其他代码调用这些部分方法,因为它们不能自行工作 - 因此您可以将较小的方法设为私有,确保他们不能在课堂外被调用。

      【讨论】:

      • 能否请您详细介绍一下有用性?
      • 不能多次调用 MyObject 吗?这不会导致创建该类的多个实例吗?
      • 否 - 调用 MyObject.getInstance() 不会创建新实例,它只会返回已经创建的实例。重复调用将继续返回相同的实例。
      【解决方案5】:

      主要原因被称为封装:不要访问对象的内部状态。

      【讨论】:

      • 您能说得更详细些吗?
      • 一个对象可能有状态;例如,它可能具有可变前景色和背景色的属性。该状态将作为某种类型变量的值保存在对象中。实施者可能希望对颜色如何改变规定限制(例如,两种颜色可能不相同)。如果变量是公开的并且可以直接访问,则用户可能会违反条件(也称为不变量),从而将对象转换为意外/非法状态。实现者可以改为将变量设为私有,并允许通过公共方法进行有效的突变。
      【解决方案6】:

      对于初学者,我会开始尽可能地限制访问。从private 开始。如果您碰巧需要其他地方的构造函数、方法或字段,但由于限制无法访问,那么接下来的步骤就是问自己:

      1. 如果它是一个方法,你真的需要访问它吗?它会改变类/实例的行为吗?你不应该让那个班级做这项工作吗?不应该将当前类(需要该字段或方法)与该类更紧密地联系起来吗?
      2. 如果是字段,是否需要获取或设置其值?您不应该添加一个完全可以做到这一点的方法吗?

      第 1 点避免了错误的耦合,第 2 点改进了封装。一旦您考虑了上述情况并得出结论确实需要减少限制,然后将其设置为进一步开放。

      【讨论】:

        最近更新 更多