好的,那么当你这样做时会发生什么。
A a1=new A();
A a2=new A();
A a3=new A();
我上传了两张关于我想象的图片。你能告诉我什么图片是真的吗?
第一张图片:
第二张图片:
我一直认为第一张照片是真的,但现在我真的不知道,我怀疑第二张照片是真的。
另外,你能解释一下每一方的作用吗? 比如,“A a1”做什么以及“新A()”做什么?
感谢。
答案 0 :(得分:11)
new A()
将调用A类的no param构造函数,并将创建一个新的内存对象。
A a1=new A(); // new memory object created
A a2=new A(); // new memory object created
A a3=new A(); // new memory object created
有三个不同的对象正在创建,因此SECOND图片是真的。
要使第一张图片成立,引用的声明应该是这样的:
A a1=new A(); // new memory object created
A a2=a1; // a2 points to the same memory object as a1 does
A a3=a1; // a3 points to the same memory object as a1 does
这里只创建了一个对象(new只使用了一次),但所有三个引用都指向它。
答案 1 :(得分:2)
不,第二张照片是真的。因为每次使用单独的引用创建新对象时,它都会成为指向内存中单独实例的单独指针。
A a1 = new A(); // a new instance of A is created in memory and can be referenced by a1.
A a2 = new A();
即使a1和a2属于同一类型,但并不意味着它们指向或引用内存中的同一对象实例。
但是,如果a1 = a2;
被执行,现在,a1
和a2
都会引用或指向内存中相同的A
对象实例。
答案 2 :(得分:1)
第一张照片适用于Strings
(由于string pooling,对编码时已知相同的字符串进行了优化):
String a1="s";
String a2="s";
String a3="s";
第二个适用于:
A a1=new A();
A a2=new A();
A a3=new A();
如果您想要String
之类的行为 - 您应该实施Flyweight
pattern。
答案 3 :(得分:1)
这是变量声明;
A a1;
您声明了一个名为a1
A
的新变量。
a1 = new A();
您将分配给a1
由new A()
生成的值,A
是A a1 = new A();
类型的新对象。
您可以一次性执行这两项操作初始化:
{{1}}
每次调用类构造函数时,都会得到一个不同且分离的类实例。没有实例知道其他实例,它们位于不同的记忆区域。
顺便说一句,这些都是编程的基础知识,所以要获得良好的阅读和快乐的学习。
答案 4 :(得分:1)
每当你看到
ABC a1 = new ABC();
表示创建了一个新对象,使用a1
可以访问它。
这与前往自行车商店并让他们获得* 新自行车* 完全相似。每次你说new
他们都会为你买一辆新自行车。
双方的意思:
右侧表示右侧有一个新的类型对象。
左侧表示您希望在左侧保留类型变量。
因此,您可以拥有不同类型的双方,但您需要注意合同或条件。
条件是左侧上的类型应该是右侧类型的超类,或者左侧是interface
,右侧类型实现它。 / p>
示例:
A a1 = new AB();
A a2 = new BC();
并且AB
和BC
都是A
的子类,或A
是将要实现的接口。
现在,在将对象分配到左侧后创建对象与具有 baloon (新创建的对象)并将字符串(a1)附加到其上时完全相似。 通过这种方式,您可以将多个字符串附加到一个气球,即
A a1 = new A();
A a2 = a1;
Bithe a1
和a2
指向同一个对象。
答案 5 :(得分:1)
浏览图片,希望这会有所帮助。
答案 6 :(得分:1)
第二张图片是正确的。
编写new总是在堆中创建一个新对象。
在现实世界中比较
a a = new A();
上面的代码可以类似于
新的A()------------------孩子的出生
a ------------------命名那个孩子(即Ram,John)
答案 7 :(得分:0)
第二张图片是正确的。三个语句中的每一个都在创建引用(A a1 =
)和内存中的实际对象(new A()
)。抛出第一张图片:))
答案 8 :(得分:0)
第二张照片是真的。每次按构造函数编写new
关键字后,都会创建类的 new 实例。每次编写someVariable = ...
时,右侧表达式的结果都将分配到变量,即创建新引用。
所以,
A a1 = new A(); // creates one object and assigns reference to a1
A a2 = new A(); // creates another object and assigns reference to a2
A a3 = a2; // just create yet another reference to previously created object
a1 = new A(); // creates new object and assigns its reference to the same variable that was previously used, so the previous object is "lost" now and can be garbage collected.