2

为什么内部类可以访问此类的输入对象参数的私有字段?

private class Inner {
    private int privatefield = 0;

    public void method( Inner inner ) {
        privatefield = 1; //ok
        inner.privatefield = 1; //this line confusing me (broken incapsulation)
    }
}
4

7 回答 7

5

这与内部类本身无关。

类中的代码始终可以访问 Java 中同一类的私有成员。private/ etc的概念是public指代码所在的位置,而不是指“this”实例还是不同的实例。受保护的访问比其他访问要复杂一些,但同样的一般原则也适用。

有关详细信息,请参阅JLS 第 6.6 节。尤其是:

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

这就解释了为什么一个嵌套类可以访问另一个嵌套类的私有字段,只要它们嵌套在同一个顶级类中,根据您的评论。这是一个奇怪的规则,我同意——而且我更喜欢 C# 在private可访问性和嵌套类型方面的方法——但上面的引用表明编译器遵守JLS 的规则。

我怀疑原因是,如果您在同一个顶级类中工作,则您要对该类中的所有代码负责,包括嵌套类-因此可以相信您不会滥用它们。

于 2013-08-29T09:14:39.417 回答
0

由于method(Inner inner)驻留在Inner类中,因此method(Inner inner)可以访问 Inner 类的私有成员。

于 2013-08-29T09:18:55.497 回答
0

为什么内部类可以访问此类的输入对象参数的私有字段?

  • 即使private内部类是外部类的成员
  • private类成员可以访问成员。
于 2013-08-29T09:14:15.917 回答
0

考虑到您的课程也没有嵌套private,因为它与您的问题无关。它与范围可见性有关。

宣言说

private 修饰符——该字段只能在其自己的中访问。

由于您访问了privatefield声明的类内部的属性,即使它是不同实例的成员, 您的封装也不会被破坏,private因此范围得以保持。

于 2013-08-29T09:15:26.720 回答
0

类中的任何方法都可以访问该类中的全局变量。私有参数仅使其他类无法访问该变量。

在这种情况下,Inner 中的方法将能够找到 var,而 Inner 之外的方法将无法找到。

于 2013-08-29T09:15:59.927 回答
0

如果您看到Docs of Controlling Access to Members of a Class

private 修饰符指定该成员只能在其自己的类中访问。

由于privatefield是您班级的成员,因此您可以访问班级内部。

于 2013-08-29T09:16:22.253 回答
0

访问修饰符定义了变量可以访问的范围,而不是单个实例是否可以访问它!

private int privatefield = 0;

您的变量是非静态的,因此它将被类的实例访问。所以inner.privatefield有道理。现在您的变量privatefieldprivate这意味着您可以在Inner class. 由于您正在访问内部的变量method()Inner class因此没有问题并且完全有效。

于 2013-08-29T09:25:40.147 回答