Java访问误解

Java访问误解,java,Java,为什么下面的代码编译得很好 public class MyStack { private static MyStack myStack ; private Stack<MyObject> stackOfMyObjects; private MyStack() { stackOfMyObjects = new Stack<MyObject>() ; } public static void pushToStack

为什么下面的代码编译得很好

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) ;
    }

}
公共类MyStack{
私有静态MyStack MyStack;
对象的私有堆栈;
私有MyStack(){
stackOfMyObjects=新堆栈();
}
公共静态无效pushToStack(MyObject MyObject,MyStack MyStack 2){
myStack2.stackOfMyObjects.push(myObject);
}
}
这里,在pushToStack方法中,如何定义myStack2stackOfMyObject成员,尽管stackOfMyObject事件是私有的

这里,在pushToStack方法中,尽管StackOfMyObject已定义为私有,但如何从myStack2访问StackOfMyObject

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

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

有关更多详细信息,请参阅。具体而言,在第6.6.1节中:

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


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

,因为它属于同一类


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

我假设MyStack 2属于MyStack类型。
StackOfMyObject定义为私有是,但它仍然在同一类中。它是一个全局定义的变量,可以从该类中创建的所有对象中访问。

您是否在问为什么类中的函数可以访问该类实例的私有成员?如果不是,谁可以?对类私有,而不是对对象私有。因此,如果您需要实现
int compareTo(T rhs)
您也可以访问右侧字段。@DavidSchwartz我已经编辑了这个问题。请看一看,我还是不明白。您似乎仍然在问“为什么类的成员函数可以访问该类实例的私有成员?”答案是,“如果不能,谁或什么可以?”私有成员变量的全部要点是让类的成员函数自由访问它们。