请考虑以下代码:
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
的“括号内”是私密的。
答案 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如何工作的任何误解。