【发布时间】:2018-01-29 17:35:10
【问题描述】:
我正在尝试培养对内部类的直觉和熟悉度。
我正在研究这个 java 的主题,经过一些研究,我开始练习。
我想出了这段代码,它的行为方式我无法理解。
我创建了一个带有公共内部类 Inner 的类 Example。
在 Example 类中,我创建了 Inner 类 obj 的对象,在 MainClass 类中,在main 函数我创建了另一个 Inner 类实例(在创建封闭类的实例之后)。
示例类代码:
public class Example {
Inner obj = new Inner(9);
class Inner {
public int x;
public Inner(int a) {
x=a;
}
}
}
主类:
public class MainClass{
public static void main ( String args[] ) {
Example example = new Example();
System.out.println(example.obj.x); // output 9
Example.Inner obj = example.new Inner(10);
System.out.println(obj.x); //output 10
System.out.println(example.obj.x); // output 9
}
}
鉴于语句Inner obj= new Inner() 和语句Example.Inner obj = example.new Inner(10) 都声明了同名的Inner 类的对象,我不明白这怎么没有问题。
我认为这与它们在内存中的存储方式有关,但它们似乎是两个完全不同的东西,但我不明白如何。
更新: 到目前为止,答案都很好,我编辑了更改代码并将构造函数数量减少到一个的问题。这应该可以澄清我的疑虑。
【问题讨论】:
-
objinmain和objinExample没有关系。如果我的名字是Gabriele,我们不是同一个人吗?或者只是有一个相同的名字而没有进一步的关系? -
两个变量的作用域完全不同。一个是main方法的局部变量。另一个是示例字段。想象一下,如果每个循环
for (int i = 0; i < N; i++)没有编译,因为其他一些不相关的代码也使用了一个名为i的变量。那将是无法管理的,不是吗? -
请对解释投反对票,至少我可以尝试编辑!投票对我很重要,我对这个问题进行了研究,我可能会因为有人投反对票而被禁止 6 个月!
-
这怎么可能是我连作文都没学过的问题的重复!?
-
为了培养直觉和熟悉内部类,不要在其封闭类之外创建它们。
Example.Inner obj = example.new Inner(10);不是典型用法。仅当您需要访问封闭类的私有字段和方法(未在您的示例中给出)时才使用内部类。内部类应该是其封闭类内部的实现助手,而不是您打算在外部使用的东西。
标签: java oop inner-classes