我找了一个解释,但一直找不到。为什么这段代码有效?具体来说 - 为什么可以访问实例的私有成员?据我所知,只有在原始类中的方法中创建实例时,它才有效。
public class MyClass {
private int thing;
public MyClass () {}
public MyClass makeMe () {
MyClass myClass = new MyClass();
myClass.thing = 1;
return myClass;
}
}
答案 0 :(得分:6)
私人字段只能由该类访问。您仍然在MyClass
的实例中运行,因此私有字段在您不使用setter的情况下可见且可访问。
要更正式一点...... JLS 6.6.1谈论访问。
这是删节片段,强调我的:
只有在类型可访问且成员或构造函数时,才能访问引用(类,接口或数组)类型的成员(类,接口,字段或方法)或类类型的构造函数。声明允许访问:
- ...否则,如果成员或构造函数被声明为私有,那么当且仅当它出现在包含声明的顶级类(第7.6节)的主体内时,才允许访问成员或构造函数。
答案 1 :(得分:2)
public MyClass makeMe () {
MyClass myClass = new MyClass();
myClass.thing = 1;
return myClass;
}
是<{1}}类里面的,因此它可以访问私人会员。