这两个内部 class 对象有何不同?
How these two inner class objects differ?
我正在努力提高对内在 classes 的直觉和熟悉度。
我正在让 myslef 关注这个 java 的主题,经过一些研究后我开始练习。
我想出了这段代码,它的行为方式我无法理解。
我创建了一个 class Example with a public inner class Inner.
在 Example class 我创建了一个对象 Inner class obj,并且在 class MainClass 中,我在主函数中创建了另一个 Inner class 实例(创建封闭 class).
的实例
示例 class 代码:
public class Example {
Inner obj = new Inner(9);
class Inner {
public int x;
public Inner(int a) {
x=a;
}
}
}
主要class:
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)
都声明了一个同名的内部 class 对象,我不明白这怎么没有任何问题.
我认为这与它们在内存中的存储方式有关,但它们似乎是 2 个完全不同的东西,但我不明白如何。
更新:
到目前为止,答案一直很好,我编辑了问题,更改了代码并将构造函数的数量减少到一个。这应该澄清我的疑虑。
您创建了两个对象:example
,Example
的一个实例,以及 obj
,Example.Inner
的一个实例。这两个对象彼此无关,不共享任何信息,因此每个对象中的 x
字段可以包含不同的 int
.
尽管您有一个内部 class,但您有两个 完全 个不同的 Inner
.
实例
由于 Inner
的构造函数将 6
分配给 x
.,因此 example.obj.x
被分配了值 6
obj
正在实例化一个新实例(因此关键字 new
),然后它为其构造函数传入值 10。
这就是您得到两个不同值的原因;因为这两个实例是完全独立的,彼此之间没有共享值(即静态字段),所以值会不同。
您有两个 Inner
class 实例,尽管两个实例具有相同的名称 obj
,但它们彼此独立。 Inner
class 在 main
方法之外定义的实例是使用 default constructor
创建的。所以 example.obj.x
输出 6
.
Inner
class 在 main
方法中定义的实例 obj
是使用 parameterized constructor
创建的,因此 obj.x
输出 10.
这里重要的是,当您执行 example.obj.x
时,您指的是 Inner
class 在主方法之外创建的实例 当您执行 obj.x
时,您指的是在主方法 中创建的 Inner
class 实例 。 Inner
的这两个实例彼此完全分开。
编辑
Answers have been great till now, I edited the question changing the
code and reducing the number of constructors to one. This should
clarify what my doubts concern.
拥有一两个构造函数不会改变任何事情。 Inner
class 在 main
方法之外定义的实例和在 main
方法内部定义的实例是 Inner
class 的两个独立实例。
x
,在 main
之外定义的 Inner
实例的数据成员的值为 9
,只能使用 Example
[=66] 访问=]的实例example
。因此 example.obj.x
输出 9
.
main
中定义的 Inner
的实例可使用 main
中定义的 obj
直接访问,其 x
的值为 10
.因此 obj.x
输出 10
.
我正在努力提高对内在 classes 的直觉和熟悉度。
我正在让 myslef 关注这个 java 的主题,经过一些研究后我开始练习。
我想出了这段代码,它的行为方式我无法理解。
我创建了一个 class Example with a public inner class Inner.
在 Example class 我创建了一个对象 Inner class obj,并且在 class MainClass 中,我在主函数中创建了另一个 Inner class 实例(创建封闭 class).
的实例
示例 class 代码:
public class Example {
Inner obj = new Inner(9);
class Inner {
public int x;
public Inner(int a) {
x=a;
}
}
}
主要class:
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)
都声明了一个同名的内部 class 对象,我不明白这怎么没有任何问题.
我认为这与它们在内存中的存储方式有关,但它们似乎是 2 个完全不同的东西,但我不明白如何。
更新: 到目前为止,答案一直很好,我编辑了问题,更改了代码并将构造函数的数量减少到一个。这应该澄清我的疑虑。
您创建了两个对象:example
,Example
的一个实例,以及 obj
,Example.Inner
的一个实例。这两个对象彼此无关,不共享任何信息,因此每个对象中的 x
字段可以包含不同的 int
.
尽管您有一个内部 class,但您有两个 完全 个不同的 Inner
.
Inner
的构造函数将 6
分配给 x
.,因此 example.obj.x
被分配了值 6
obj
正在实例化一个新实例(因此关键字 new
),然后它为其构造函数传入值 10。
这就是您得到两个不同值的原因;因为这两个实例是完全独立的,彼此之间没有共享值(即静态字段),所以值会不同。
您有两个 Inner
class 实例,尽管两个实例具有相同的名称 obj
,但它们彼此独立。 Inner
class 在 main
方法之外定义的实例是使用 default constructor
创建的。所以 example.obj.x
输出 6
.
Inner
class 在 main
方法中定义的实例 obj
是使用 parameterized constructor
创建的,因此 obj.x
输出 10.
这里重要的是,当您执行 example.obj.x
时,您指的是 Inner
class 在主方法之外创建的实例 当您执行 obj.x
时,您指的是在主方法 中创建的 Inner
class 实例 。 Inner
的这两个实例彼此完全分开。
编辑
Answers have been great till now, I edited the question changing the code and reducing the number of constructors to one. This should clarify what my doubts concern.
拥有一两个构造函数不会改变任何事情。 Inner
class 在 main
方法之外定义的实例和在 main
方法内部定义的实例是 Inner
class 的两个独立实例。
x
,在 main
之外定义的 Inner
实例的数据成员的值为 9
,只能使用 Example
[=66] 访问=]的实例example
。因此 example.obj.x
输出 9
.
main
中定义的 Inner
的实例可使用 main
中定义的 obj
直接访问,其 x
的值为 10
.因此 obj.x
输出 10
.