1

在下面的“Tosee”类中,当我调用 s.hiddenInt 时,hiddenInt 是可见的。但是,当我在另一个类“CantSee”中创建“ToSee”对象时,私有变量不可见。为什么会这样?我的印象是私有意味着在类的任何实例中,客户端都看不到那个特定的实例变量或方法?那么为什么我可以在“ToSee”的主要方法中看到 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);
    }

}
4

5 回答 5

2

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

于 2013-09-20T12:58:06.700 回答
1

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

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

    public class CantSee {
        ...
    }
}

或者

public class CantSee {
    ...
    public class ToSee {
        ...
    }
}
于 2013-09-20T12:57:26.590 回答
1

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

您可以在其中看到变量hiddenIntToSee.main因为ToSee.main它是TooSee该类的静态方法。因此它可以访问 a 的所有私有变量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
    }
}
于 2013-09-20T12:59:04.487 回答
1

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

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

于 2013-09-20T13:00:06.690 回答
1
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 方法。)

于 2013-09-20T13:05:18.840 回答