【问题标题】:Meaning of the Private visibility modifierPrivate 可见性修饰符的含义
【发布时间】:2013-09-25 20:54:19
【问题描述】:

在下面的“Tosee”类中,当我调用 s.hiddenInt 时,hiddenInt 是可见的。 但是,当我在另一个类“CantSee”中创建“ToSee”对象时,私有变量不可见。为什么会这样?我的印象是私有意味着在类的任何实例中,客户端都看不到那个特定的实例变量或方法?那为什么我能在 'ToSee' 的 main 方法中看到 hiddenInt 呢?

public class ToSee {

    private int hiddenInt = 5;

    public static void main(String[] args) {
        ToSee s = new ToSee();
        System.out.println(s.hiddenInt);

    }
}


public class CantSee {

    public static void main(String[] args) {
        ToSee s = new ToSee();
        System.out.println(s.hiddenInt);
    }

}

【问题讨论】:

  • 之所以称为私有是因为它只对特定类的实例可见

标签: java object instance visibility private


【解决方案1】:

Java 中的私有意味着变量或方法只能在声明它的类中访问。如果您对私有的印象是真实的,那么它将无法在任何地方访问,这使得它完全无用。

【讨论】:

    【解决方案2】:

    main 方法在 Java 中具有特殊的含义,但它仍然是属于特定类的方法。

    main 方法可以通过本地实例(在实例字段的情况下)或直接(在static 字段的情况下)访问封闭类中的私有字段。

    【讨论】:

      【解决方案3】:

      修饰符 private 使变量或方法对声明它的类型(类)是私有的。所以只有这个类可以看到它。

      您可以在ToSee.main 中看到变量hiddenInt,因为ToSee.mainTooSee 类的静态方法。因此它可以访问ToSee 的所有私有变量,无论是静态变量还是实例变量。

      私有也不意味着实例私有。一个类的实例可以访问同一类的另一个实例的私有变量。

      public class ToSee {
      
           private int hiddenInt = 5;
      
           public void printInt(ToSee toSee){
               System.out.println(toSee.hiddenInt);
           }
      
           public static void main(String[] args) {
              ToSee tooSee1 = new ToSee();
              ToSee tooSee2 = new ToSee();
      
              tooSee2.hiddenInt = 10;
      
              tooSee1.printInt(tooSee2); // will output 10
          }
      }
      

      【讨论】:

        【解决方案4】:
        I was under the impression that private means that in any instance of a class, 
        the client cant see that particular instance variable or method?
        

        不正确! 私有访问修饰符仅仅意味着使用它的变量只能在封闭类中访问。时期。由于您的 main() 方法位于 ToSee 类中,该类中您拥有 hiddenInt 私有实例变量,因此它是可见的。与不在 ToSee 类中的 CantSee 类一样,它是不可见的(您需要使用 getter/setter 方法。)

        【讨论】:

          【解决方案5】:

          private 意味着对于它所在的最外层封闭类之外的任何代码都不可见。由于CantSee 类与ToSee 类是分开的,因此它看不到私有字段。如果CantSeeToSee 都是同一类的成员,或者一个是另一个的成员,那么您能够读取私有字段。下面是一些私有字段可读的结构示例:

          public class Outer {
              public class ToSee {
                  ...
              }
          
              public class CantSee {
                  ...
              }
          }
          

          public class CantSee {
              ...
              public class ToSee {
                  ...
              }
          }
          

          【讨论】:

          • 不,这是误导。 private 表示在定义它的 之外不可见,而不是文件。
          • @DuncanJones 这措辞很糟糕,但在技术上是正确的; "A private class member or constructor is accessible only within the body of the top level class",每个文件只包含一个顶级类。
          • @DuncanJones 是的,解决了这个问题。忘了你可以在同一个文件中有两个顶级类。
          • Sam,您当前的编辑现在在技术上是不正确的,因为private 成员在内部/外部类中可见。
          • 用一些例子修正了答案,希望减少技术上的不正确/不完整
          猜你喜欢
          • 1970-01-01
          • 2013-05-19
          • 1970-01-01
          • 2014-05-28
          • 2014-11-06
          • 2016-04-08
          • 2020-06-12
          • 1970-01-01
          • 2015-05-25
          相关资源
          最近更新 更多