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方法中,如何定义myStack2的stackOfMyObject成员,尽管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我已经编辑了这个问题。请看一看,我还是不明白。您似乎仍然在问“为什么类的成员函数可以访问该类实例的私有成员?”答案是,“如果不能,谁或什么可以?”私有成员变量的全部要点是让类的成员函数自由访问它们。