这两个内部 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 个完全不同的东西,但我不明白如何。

更新: 到目前为止,答案一直很好,我编辑了问题,更改了代码并将构造函数的数量减少到一个。这应该澄清我的疑虑。

您创建了两个对象:exampleExample 的一个实例,以及 objExample.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.