为什么以下代码编译正常?
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 被定义为私人?
答案 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中。它是一个全局定义的变量,可以从所有从这个类创建的对象中访问。