2013-08-29 109 views
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) 
    } 
} 
+0

如果它是私密的,一个类可以访问该属性。包,子类或整体世界中没有任何东西,但同一类中的所有东西都没有。 http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html – Joetjah

+0

所以任何内部类的私有字段都是外部类的字段(没有访问限制)。但它是中断封装。在我看来,我应该只能访问外部字段和内部类字段,而不能访问另一个内部类实例的字段。 – pswrdf

+0

第一种情况在这里解释:[链接](http://stackoverflow.com/a/17027518/2728393) – pswrdf

回答

5

这与内部类本身无关。

中的代码总是可以访问Java中同一类的私有成员。 private/public等的概念是指代码所在的位置,而不是指它是指“这个”实例还是另一个实例。受保护的访问比其他访问稍微复杂一些,但同样的一般原则适用。

查看JLS section 6.6了解更多详情。特别是:

否则,如果成员或构造函数被声明为私有的,那么当且仅当它出现在包含成员声明的顶级类(§7.6)构造函数。

这就解释了为什么一个嵌套类可以访问另一个嵌套类的私有字段,只要它们嵌套在同一个顶级类中,就像你的注释一样。这是一条奇怪的规则,我同意 - 我更喜欢C#的方法private可访问性和嵌套类型 - 但上面的报价显示编译器服从JLS的规则。

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

+0

你的意思是内部类与外部类是相同的类? – pswrdf

+0

@pswrdf:不,但是您显示的所有代码都与'Inner'有关。你的代码在'Inner'中,它指的是一个'Inner'的实例 - 所以它可以访问私有字段。 –

+0

因此,如果您将使用与Inner相同级别的其他课程,您也可以访问。例如:'private class Inner {void method(Inner2 inner2)....} private class Inner2 {}' – pswrdf

0

为什么内部类可以访问这些类的输入对象特性参数的私人领域?

  • 即使private,内部类是外类的成员
  • private成员的类的成员访问。
0

考虑到你的班级既不嵌套也不嵌套private,因为它与你的问题无关。它与示波器可视性有关。

Declaration says

private修饰符 - 场仅仅存在于自己类是访问。

既然你访问一个声明,即使它是一个不同的实例您的封装不破的成员在类中的privatefield财产,private范围保持不变。

0

类中的任何方法都可以访问该类中的全局变量。 private参数只能使OTHER参数不能访问变量。

在这种情况下,Inner中的方法将能够找到var以及Inner以外的方法将无法访问的方法。

0

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

0

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

private int privatefield = 0; 

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