这两个内部类对象有何不同?

时间:2018-01-29 17:35:10

标签: java oop inner-classes

我试图降低对内心阶级的直觉和熟悉程度 我正在将myslef用于这个java的主题,经过一些研究后我开始练习了。
我想出了这段代码,其行为方式让我无法理解 我创建了一个具有公共内部类内部的类示例示例类中,我创建了内部 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类的对象,我不明白这不会给出任何问题。 我认为它们是如何在记忆中被淹没的,但它们似乎是两种完全不同的东西,但我不明白如何。

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

3 个答案:

答案 0 :(得分:1)

您有两个if (response.user_accounts) { $('#account').selectpicker('val', response.user_accounts.account_id); }类实例,虽然两个实例具有相同的名称Inner,但它们彼此分开。 obj方法之外定义的Inner类实例是使用main创建的。因此default constructor输出example.obj.x

6方法中定义的

Inner类实例obj是使用main创建的,因此parameterized constructor输出10。

重要的是,当您执行obj.x时,您指的是在{main}方法之外创建的example.obj.x的实例以及执行Inner时,您指的是在main方法中创建的obj.x类实例Inner的这两个实例彼此完全分开。

修改

  

答案一直很好,直到现在,我编辑了改变问题的问题   代码并将构造函数的数量减少到一个。这应该   澄清我怀疑的问题。

拥有一个或两个构造函数不会改变任何东西。在Inner方法之外定义的Inner类实例和在main方法中定义的类实例是main类的两个独立实例。

Inner,在x之外定义的Inner实例的数据成员的值为main,并且只能使用9类来访问实例Example。因此example输出example.obj.x

9内定义的Inner实例可以使用main中定义的obj直接访问,其main的值为x。因此10输出obj.x

答案 1 :(得分:0)

您创建了两个对象:exampleExample的实例和objExample.Inner的实例。这两个对象彼此无关,并且不共享任何信息,因此每个对象中的x字段可以包含不同的int

答案 2 :(得分:0)

无论你有一个内部类,你都有两个完全不同的Inner实例。

由于example.obj.x的构造函数将Inner分配给6

x的值为6。

obj正在实例化一个新实例(因此关键字new),然后它为其构造函数传递值10.

这就是为什么你得到两个不同的价值观;因为这两个实例彼此完全分离并且彼此之间没有共享值(即静态字段),所以值将不同。