Java访问误解

时间:2012-03-20 09:16:43

标签: java

为什么以下代码编译正常?

public class MyStack {

    private static MyStack myStack ;
    private Stack<MyObject> stackOfMyObjects;

    private MyStack() {
        stackOfMyObjects = new Stack<MyObject>() ;
    }

    public static void pushToStack(MyObject myObject, MyStack myStack2) {
        myStack2.stackOfMyObjects.push(myObject) ;
    }

}

这里,在 pushToStack 方法中, myStack2 stackOfMyObjects 成员如何 stackOfMyObjects 被定义为私人?

3 个答案:

答案 0 :(得分:10)

  

这里,在pushToStack方法中,如何通过myStack2访问stackOfMyObjects,虽然stackOfMyObjects已被定义为private?

因为它仍然是MyStack。 Java中的访问控制是关于代码出现的位置,而不是它是否访问“不同”对象。

基本上,MyStack中的所有代码都可以使用在MyStack内声明的私有成员。

有关详细信息,请参阅section 6.6 of the JLS。具体而言,在6.6.1节中:

  

否则,如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问。

此处,访问确实发生在包含MyStack变量声明的顶级类(stackOfMyObjects)的主体内,因此允许访问。 / p>

答案 1 :(得分:3)

因为它属于同一类。

Private在类范围内,而不是对象范围,因此当在Class中时,您可以访问该类的所有私有/受保护成员。

答案 2 :(得分:0)

我认为 myStack2 的类型为 MyStack stackOfMyObjects 被定义为私有,但它仍然在相同的 MyStack中。它是一个全局定义的变量,可以从所有从这个类创建的对象中访问。