繁体   English   中英

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

[英]What happens when you create a new object?

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

A a1=new A();

A a2=new A();

A a3=new A();

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

第一张图片: 在此输入图像描述

第二张图: 在此输入图像描述

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

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

谢谢。

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图片是真的。

要使FIRST图片成立,引用的声明应该是这样的:

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只使用一次),但所有三个引用都指向它。

不,第二张图是真的。 因为每次使用单独的引用创建新对象时,它都会成为指向内存中单独实例的单独指针。

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对象实例。

对于Strings第一张图片是正确的(由于字符串池化 ,对编译时已知相同的字符串进行了优化):

String a1="s";
String a2="s";
String a3="s";

第二个是真的:

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

如果你想要像String这样的行为 - 你应该实现Flyweight模式

这是一个变量声明 ;

A a1;

您声明一个名为a1的新变量,类型为A

a1 = new A();

您为a1 分配了由new A()产生的值,该new A()A类型的新对象。

您可以在初始化时同时执行这两项操作:

A a1 = new A();

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

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

每当你看到一个

ABC a1 = new ABC();

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

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

双方的意义:

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

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

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

例:

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

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

现在,在将对象分配到左侧后创建对象与使用气球 (新创建的对象)并将字符串(a1)附加到其上完全相似。 这样你可以将多个字符串附加到一个气球,即

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

比特a1a2指向同一个对象。

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

参考图片

参考图片

第二张图片是正确的。

写新的总是在堆中创建一个新对象。

在现实世界中比较

A =新A();

上面的代码可以类似

新的A()------------------孩子的出生

一个------------------命名那个孩子(即Ram,John)

第二张图是正确的。 三个语句中的每一个都创建一个引用( A a1 = ),并在内存中创建一个实际对象( new A() )。 抛出第一张图片:)

第二张图是真的。 每次按构造函数编写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. 

第二个是正确的,因为每当创建一个对象时,它的构造函数只被调用一次。

这里三个不同的对象由构造函数调用创建。 所以构造函数被调用三次。

而对于给定对象,可以为普通对​​象方法调用任意次数,而不是构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM