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