为什么内部类可以访问此类的输入对象参数的私有字段?
private class Inner {
private int privatefield = 0;
public void method( Inner inner ) {
privatefield = 1; //ok
inner.privatefield = 1; //this line confusing me (broken incapsulation)
}
}
答案 0 :(得分:5)
这与内部类本身无关。
类中的代码始终可以访问Java中同一类的私有成员。 private
/ public
等的概念指的是代码所在的位置,而不是它是指“this”实例还是其他实例。受保护的访问比其他访问稍微复杂一些,但同样的一般原则适用。
有关详细信息,请参阅JLS section 6.6。特别是:
否则,如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问。
这解释了为什么一个嵌套类可以访问另一个嵌套类的私有字段,只要它们根据您的注释嵌套在同一个顶级类中。这是一个奇怪的规则,我同意 - 我更喜欢C#在private
可访问性和嵌套类型方面的方法 - 但上面的引用表明编译器 遵守JLS的规则。 / p>
我怀疑理由是,如果你在同一个顶级类中工作,那么你负责该类中的所有代码,包括嵌套类 - 所以你被信任不要滥用它们。 / p>
答案 1 :(得分:0)
为什么内部类可以访问此类的输入对象参数的私有字段?
private
,内部类也是外部类的成员private
成员可以为班级成员访问。答案 2 :(得分:0)
请注意,您的类不会嵌套private
,因为它与您的问题无关。它与范围可见性有关。
私人修饰符 - 该字段只能在其自己的类中访问。
由于您访问了声明的类中的privatefield
属性,即使它是其他实例的成员 ,您的封装也不会被破坏,{ {1}}范围得以维持。
答案 3 :(得分:0)
类中的任何方法都可以访问该类中的全局变量。 private参数只能使OTHER类无法访问变量。
在这种情况下,Inner的方法将能够找到var,而Inner之外的方法将无法进行。
答案 4 :(得分:0)
如果您看到Docs of Controlling Access to Members of a Class
private修饰符指定只能在自己的类中访问该成员。
由于privatefield
是您班级的成员,因此您可以在班级内访问。
答案 5 :(得分:0)
由于method(Inner inner)
位于Inner
类,因此method(Inner inner)
可以访问Inner类的私有成员。
答案 6 :(得分:0)
访问修饰符定义变量可以访问的范围,而不是单个实例是否可以访问它!
private int privatefield = 0;
您的变量是非静态的,因此它将通过类的实例进行访问。所以inner.privatefield
是有道理的。现在,您的变量privatefield
为private
,这意味着您可以在Inner class
内访问它。由于您正在访问位于method()
内的Inner class
内的变量,因此没有问题且完全有效。