这段代码到底创建了几个对象?

在回答这个问题之前,先带大家了解几个知识点:

  • Java内存分配总共分为五个区,分别是:方法区栈内存堆内存、本地方法栈、内存区(加粗的为常用)
  • 方法区:主要存储的是.java程序编译之后的.class文件
  • 栈内存:方法运行时是在栈内存中运行、以及各种变量存储的地方
  • 堆内存:主要有字符串常量池,包括new关键词出来的对象也在堆内存中,系统并为其在此分配地址

有了以上的知识储备我们来看下面这段代码:

public static Demo{
	public static void main(String[] args){
		String str=new string("abc");
	}
}

在这里插入图片描述

  1. 先将编译之后的class文件放入方法区中
  2. 然后运行main方法,此时main方法存储在栈内存中
  3. 其实这里的
 String str=new string("abc");

可以理解成

String str1="abc";
String str=new String(str1);
  1. 其实该代码段运行的时候,就是先在堆内存中的字符串常量池创建一个字符串常量str1对象,然后其作为String函数的参数去new一个新的对象,此时就会在堆内存中产生str对象,并为其分配空间和地址。
    综上所述,该代码段总共产生了2个对象,而不是一个昂!
    特殊情况:如果堆内存中的字符串常量池中本身就存在“abc”字符串,那么此段代码就只产生了一个对象。
    如果你认为我说的对的话,还请麻烦点个赞吧!ღ( ´・ᴗ・` )
  • 14
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这段代码创建两个对象,分别是字符串对象s1和s2,它们的值都为"bc"。因为字符串是不可变对象,所以在创建s2时,编译器会发现已经有一个值为"bc"的字符串对象存在,因此不会再创建一个新的对象,而是将s2指向已有的对象。 ### 回答2: 以上代码段将创建两个对象,分别是字符串"bc"的两个实例。虽然s1和s2的值相同,但是它们是不同的字符串对象,每一个都有自己的内存空间和地址。在实际编程中,应该注意不同的字符串实例之间的比较,应该使用equals()函数而不是"=="运算符。因为"=="运算符比较的是地址,而equals()函数比较的是值,只有前者在地址相同的情况下才返回true,而后者只要字符串的值相同就会返回true。 ### 回答3: 根据以上代码段,将会创建两个对象。 我们首先需要明确的是,C++中的string是一种类类型,每次定义string变量时,都会创建一个对象。 在以上代码中,第一行定义了一个名为s1的string变量,同时将其初始化为"bc",因此将会创建一个名为s1的对象,并将其值设为"bc"。 同理,第二行也定义了一个名为s2的string变量,同时将其初始化为"bc",这样也会创建一个作为s2的对象,并将其值设置为"bc"。 我们可以看到,虽然s1和s2的值相同,但是它们仍然是两个不同的对象。这是因为C++中的string是一个类类型,它封装了一系列的成员函数和数据成员,并且每次定义变量时,都会创建一个新的对象来存储相应的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值