内部类中私有变量的范围

时间:2015-10-16 12:55:20

标签: java scope

请考虑以下代码:

scanf ("%d", &test)

Java允许类scanf ("%c", &option)访问私有实例变量public class Foo { class Bar { private String barbar; public Bar( String b ) { barbar = b; } } class Meh { Bar b = new Bar("BAR!"); public void displayName() { System.out.println( b.barbar ); } } } ,该变量在Meh中声明为barbar

我知道在here之前已经问过这个问题。然而,答案基本上重申了观察到的范围是什么(private可以在类Bar的大括号内访问),但没有提供任何解释。经过一些谷歌搜索,我无法对这种行为进行良好的讨论。我想知道的是,这种范围界定的具体原因是什么。我原本希望barbar在班级Foo的“括号内”是私密的。

4 个答案:

答案 0 :(得分:5)

这方面的基本方面是 inner classes (与静态嵌套类相对)是 其封闭类的一部分。它们不是分开的,也不是彼此分开的。因此,就像封闭类的其他部分(构造函数和方法)可以访问其所有私有信息一样,内部类的所有成员也是如此。从某种意义上说,内部类是我们用作方便的抽象机制的一种小说。由于内部类是封闭类的一部分,因此它们的私有信息是私有信息,因此与其他内部类共享。

答案 1 :(得分:2)

根据JLS

  

类的主体声明成员(字段和方法以及嵌套   类和接口),实例和静态初始化器,以及   构造函数。成员的范围是   成员的全体声明类   属于。字段,方法,成员类,成员接口和   构造函数声明可以包括访问修饰符   公共,受保护或私人。

因此,根据示例,类Bar和类Meh都属于类Foo

因此,根据规范中的第一行,Foo的任何成员都可以访问其所有其他成员,无论其是字段方法还是嵌套类/接口。

评论问题:

  

如果我将Bar中的变量设为public而不是私有,那么它会在Foo之外变得可访问,即使它来自内部类吗?

是的,当然可以从课堂外访问。 请看下面的例子

class A {

    Foo foo = new Foo();
    Foo.Bar bar = foo.new Bar("name");

    public void someOtherMethod() {
        bar.barbar = "someOtherName"; 
        //this is valid only if barbar is public
        //or if it is default and within the same package
    }

}

答案 2 :(得分:1)

内部类只是一种干净地分离一些真正属于原始外部类的功能的方法。它们旨在满足您的2个要求时使用:

如果在一个单独的类中实现,那么外部类中的某些功能将是最清晰的。 尽管它位于一个单独的类中,但功能与外部类的工作方式密切相关。 鉴于这些要求,内部类可以完全访问其外部类。因为它们基本上是外部类的成员,所以它们可以访问外部类的方法和属性 - 包括私有类。

答案 3 :(得分:0)

除非您与设计该语言的人交谈,否则我认为您不会找到该语言设计背后的理由。但是,人们通常可以通过Java语言规范深入了解“为什么”。 Section 6.3 (Scope of a Declaration)列出了范围规则,并举例说明了实施规则。

具体而言,您所询问的行为包含在以下声明中:

  

由块直接包含的本地类声明的范围   是紧邻的块的其余部分,包括它自己的块   课堂宣言。

您的两个本地类具有相同的范围,即“立即封闭的块”,特别是类Foo

也许在您的问题中,您可以解释为什么您认为封闭类无法访问barbar,然后我们可以解决您对Java如何工作的任何误解。