创建新对象时会发生什么?

时间:2013-10-06 16:38:01

标签: java object

好的,那么当你这样做时会发生什么。

A a1=new A();

A a2=new A();

A a3=new A();

我上传了两张关于我想象的图片。你能告诉我什么图片是真的吗?

第一张图片: enter image description here

第二张图片: enter image description here

我一直认为第一张照片是真的,但现在我真的不知道,我怀疑第二张照片是真的。

另外,你能解释一下每一方的作用吗? 比如,“A a1”做什么以及“新A()”做什么?

感谢。

9 个答案:

答案 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;被执行,现在,a1a2都会引用或指向内存中相同的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();

分配给a1new A()生成的值,AA a1 = new A(); 类型的新对象。

您可以一次性执行这两项操作初始化

{{1}}

每次调用类构造函数时,都会得到一个不同且分离的类实例。没有实例知道其他实例,它们位于不同的记忆区域。

顺便说一句,这些都是编程的基础知识,所以要获得良好的阅读和快乐的学习。

答案 4 :(得分:1)

每当你看到

ABC a1 = new ABC();

表示创建了一个新对象,使用a1可以访问它。

这与前往自行车商店并让他们获得* 新自行车* 完全相似。每次你说new他们都会为你买一辆新自行车。

双方的意思:

右侧表示右侧有一个新的类型对象。

左侧表示您希望在左侧保留类型变量。

因此,您可以拥有不同类型的双方,但您需要注意合同或条件。 条件是左侧上的类型应该是右侧类型的超类,或者左侧是interface,右侧类型实现它。 / p>

示例:

A a1 = new AB();
A a2 = new BC();

并且ABBC都是A的子类,或A是将要实现的接口。

现在,在将对象分配到左侧后创建对象与具有 baloon (新创建的对象)并将字符串(a1)附加到其上时完全相似。 通过这种方式,您可以将多个字符串附加到一个气球,即

A a1 = new A();
A a2 = a1;

Bithe a1a2指向同一个对象。

答案 5 :(得分:1)

浏览图片,希望这会有所帮助。

Refer Image

Refer image

答案 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.