创建对象

Java 语法
第 2 级 , 课程 3
可用
创建对象 - 1

“嗨,你最喜欢的老师又来了。由于你取得了这么大的进步,所以我决定向你讲讲对象以及如何使用对象。”

要创建对象,你需要键入关键字‘new’,后跟其类型名称(类名)。例如,假定我们有一个名为‘Cat’的类:”

代码 说明
Cat cat;
声明名为 cat 的 Cat 引用变量。变量 cat 的值为 null。
new Cat();
创建 Cat 对象。
Cat cat = new Cat();
创建名为 cat 的 Cat 引用变量。
创建新的 Cat 对象。将对新创建的对象的引用赋给变量 cat。
Cat kitty = new Cat();
Cat smokey = new Cat();
创建两个对象。将对这两个对象的引用赋给两个不同的变量。
Cat kitty = new Cat();
Cat smokey = new Cat();

smokey = kitty;
创建两个对象。将对这两个对象的引用赋给两个不同的变量。

然后,我们将变量 smokey 设置为等于对变量 kitty 所引用的对象的引用。两个变量现在都引用最先创建的对象。
(由于任何地方都不再引用第二个对象,因此它现在被视为垃圾)

Cat kitty = new Cat();
Cat smokey = null;

smokey = kitty;

kitty = null;
创建一个 Cat 对象,并将其引用赋给第一个变量 (kitty)。第二个变量 (smokey) 存储一个空 (null) 引用。

两个变量引用同一个对象。

现在,只有 smokey(而不是 kitty)引用对象。

“如果我们创建一个对象而不在任何变量中保存引用,会发生什么?”

“如果我们只是创建一个对象而不将其赋给变量,Java 机器将创建该对象,然后将其声明为垃圾(未使用的对象)。不久后,将在垃圾收集期间处理该对象。”

“我该如何处理不再需要的对象?”

“你不需要处理。一旦没有变量引用某个对象,该对象就会被标记为垃圾, Java 机器在下次收集垃圾时会将其销毁。

只要对象至少有一个引用,该对象即被视为活跃对象并且不会被销毁。如果你想尽快处理对象,可以通过为引用该对象的所有变量赋值 null 来清除该对象的所有引用。

“我明白了。与上几节课相比,这节课看起来非常简单。”

“迭戈整夜都在考虑给你布置什么任务。他做出如此特别的努力,都只为了你。他很有幽默感,你觉得吗?”

评论 (41)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Lynnn. 级别 3,Guangdong,China
20 八月 2023
Cat类代码的内存解析(根据在其他地方自学内容画的,如有误还请大家帮忙指出。做个笔记以防以后忘了,也希望能帮助大家理解课程的例子。如果图片加载不出来,点击文字下方左下角空白部分即可打开图片)
HOHOZ 级别 11,Australia
22 十一月 2023
哇,感谢分享,做的好详细
Anonymous #11374464 级别 9,San Jose
28 七月 2023
当kitty和smoky都被各赋一个对象引用时,执行smoky = kitty后两个变量都引用到同一个对象。请问为什么在smoky指向null的情况中,执行smoky = kitty后,两个变量不会同样引用到kitty的原对象,而是kitty指向了null呢?
Henry Lee 级别 6,Tokyo,Japan
30 七月 2023
你这个问题有点怪。有特定的一步让kitty是指向null的。
Anonymous #11374464 级别 9,San Jose
31 七月 2023
哦好的谢谢,漏看了第6行代码。所以如果不执行第6行,那么两个变量都是引用kitty的原对象对吗
Henry Lee 级别 6,Tokyo,Japan
31 七月 2023
没错,引用同一个对象
walton831 级别 4,Xian,China
10 七月 2022
请问"smokey = null",应该如何理解呢? 新建了一个名为“smokey”的“Cat”类变量,然后指向“空”? 在这里的“空”是什么意义呢?烦请大佬解惑...
David L 级别 13,newyork,United States
19 八月 2022
Cat smokey = null 可以理解为 Cat smokey ;
Anonymous #11015171 级别 24,Chengdu,中国
17 十月 2022
三种索引:类、接口和数组。null是一种特殊的索引,null在运行时没有指向任何类型,可以转换成任何类型,索引类型默认值是null。
KAI 级别 22,Wenzhou,China
26 二月 2023
这是我的个人理解,要是不对欢迎指正。 我觉得“smokey=null”是Cat引用类型的变量smokey这个内存区域里只有0;前面说过地址为0的内存不在任何对象,所以指向空。
KAI 级别 22,Wenzhou,China
26 二月 2023
补充: 引用类型所占内存大小与你系统位数(地址)有关,32位 4个字节(32位寻址空间也就是内存最大是4GB) 64位8个字节(64位理论上寻址空间也就是内存最大是16TB)
micro 级别 16,China,China
4 五月 2023
可以理解为这个某复合(引用)类型的变量smokey所代表的存储空间里现在存放的是null(也就是‘null引用’,若Cat smokey = new Cat(),则smokey所代表的存储空间存放的是一个类(复合/引用)对象的引用,即Cat对象的引用(或者说是Cat对象的地址))引用,而Java机器看到这个null后就知道它不指向任何对象了。 同时你在字典上看的话null不只有空的意思,还有“无效的”、“零值的”、“无内涵的”。
weidor 级别 41,China,Hong Kong
3 六月 2022
string s = ”“; system.out.println(s);
Squad303 级别 16,China,China
20 四月 2022
我超,贝拉
龚凌江 级别 13,China,China
12 十二月 2021
复制那句话做好。
illion 级别 9,China,China
12 十一月 2021
打卡!
Anonymous #10865265 级别 9,Zhengzhou,China
8 十一月 2021
mark
自证预言 级别 4,Nanjing,China
3 九月 2021
jiayou
Iyhsy 级别 4,China
18 七月 2021
标点符号是中文的,,
勇成 文 级别 12,China,China
28 十二月 2022
多谢提醒