java中对于new的理解

本文深入探讨了Java中new关键字的作用,解释了new如何用于创建对象,并存储在堆内存中,对比了引用变量与基本类型变量的区别。同时,介绍了垃圾回收机制如何管理不再使用的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

之前虽然有些java基础,但是对于一些很基本的知识点,却没有深入的理解。这篇博客主要是对于java中用于初始化的new进行初步了解。

new的作用是什么?

问题提出

我们在创建一个新的对象时,比如

String s = new String();

其中,new的作用到底是什么呢?

如果没有new的变量,其表示的含义又是什么呢?

new的作用

可以将变量看作是一个操纵对象的标识符,那么操纵的标识符实际上就是对象的一个引用.

举个例子来说明引用:

可以将遥控器想象成一个引用,而电视机就是一个对象,那么如果想要操纵电视机(对象),比如调低音量,实际操纵的是遥控器(引用),然后再由遥控器(引用)去操纵电视机(对象)。

也就是我们可以通过遥控器(引用)去间接操纵电视机(对象)。此外,即使没有电视机(对象),遥控器(引用)也可以单独存在。例如

String s;

这里,我们就只是创建了一个引用,或者理解为声明了一个变量,并没有创建对象,此时s并没有和任何对象关联。如果此时向s发送一个消息,就会返回一个运行时错误。

比较安全的做法就是创建一个引用的同时,便将其与新的对象相关联。而操作服new就是用来完成这个任务的,可以将new理解为给一个新的对象,例如

String s = new String("hello");

java程序,运行存储

这里只是简单介绍堆栈,
: 位于通用RAM中,但通过堆栈指针可以从处理器那里获得直接支持。是一种快速有效的分配存储方法。创建程序时,java系统必须知道存储在栈内所有项的确切生命周期,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些java数据存储在栈中——特别是对象引用,但是java对象并不存储于其中。
: 一种通用的内存池,用于存放所有的java对象。相较于栈来说,自由度更大一些——编译器不需要知道存储的数据在堆里存活多长时间。当需要一个对象时,只需用new写一行简单的代码,当执行这行代码时会自动在堆里进行存储分配。

特例:基本类型

因为new将对象存储在"堆"里,故用new创建一个对象——特别是小的、简单的变量往往不是很有效。故(为什么就故了??)对于这些类型 不用new来创建变量,而是创建一个并非是引用的“自动”变量,这个变量直接存储“值”并置于栈中,因此更加高效。

java中的基本数据类型一定存储在栈中吗?

常见的基本类型

基本类型大小包装器类型
char16-bitsCharacter
byte8 bitsByte
short16 bitsShort
int32 bitsInteger
long64 bitsLong
float32 bitsFloat
double64 bitsDouble
void-Void

其中包装器,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型。可在类型转换中使用。
基本类型初始化,例如

char c = 'x';
Character ch = new Character(c);

另外new创建的对象,只要你需要就会一直保留下去。
java中让对象继续存在,为了防止这些对象填满内存空间,有一个垃圾回收器用来监视new创建的所有对象,并辨别那些不会再被引用的对象,随后就释放这些对象内存空间。以便供其他新的对象使用。

例如

{
	String s = new String("Hello");
} // end of scope

引用s在作用域终点就消失了,因为s之前存储在栈中,当s所在的代码块执行完成后,作为局部变量的s就会从栈中退出,然而s指向的String对象仍占据内存空间。如果之后我们不再需要的话,他们就会自行消失的。

总结

主要介绍了引用和对象的概念以及两者之间的关系。还介绍了new的特例——基本类型以及其他关于new的知识

参考

BruceEckel, 埃克尔, and 陈昊鹏. “Java编程思想.” (2007).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值