我试图降低对内心阶级的直觉和熟悉程度
我正在将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类的对象,我不明白这不会给出任何问题。
我认为它们是如何在记忆中被淹没的,但它们似乎是两种完全不同的东西,但我不明白如何。
更新 答案一直很好,直到现在,我编辑了更改代码的问题,并将构造函数的数量减少到一个。这应该澄清我怀疑的问题。
答案 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)
您创建了两个对象:example
,Example
的实例和obj
,Example.Inner
的实例。这两个对象彼此无关,并且不共享任何信息,因此每个对象中的x
字段可以包含不同的int
。
答案 2 :(得分:0)
无论你有一个内部类,你都有两个完全不同的Inner
实例。
example.obj.x
的构造函数将Inner
分配给6
, x
的值为6。
obj
正在实例化一个新实例(因此关键字new
),然后它为其构造函数传递值10.
这就是为什么你得到两个不同的价值观;因为这两个实例彼此完全分离并且彼此之间没有共享值(即静态字段),所以值将不同。