String string=new String("wangjun")一共创建了几个对象详解

首先,分析这个问题从两方面:

一:堆内存

二:常量池

总结:如果有new关键字两个方面都分析,如果没有,只判断常量池就可解决问题。

分以下几种情况:

1,String str = "ab";

该语句创建对象的过程:先在常量池中查找是否有内容为"ab"的字符串对象,若有,直接将该对象的引用赋给str;若没有,则在常量池中创建"ab"对象,再将其引用赋给str。因为没有new关键字,所以操作的只有常量池。

2,String str = new String("ab");

该语句创建对象的过程:分两种情况,

  1. 先在常量池中查找是否有内容为“ab“的字符串对象,若有,直接将该对象的引用赋值给str;若没有,则在常量池中创建”ab“对象,再将其引用给str。
  2. 这里有new关键字,所以它会在堆内存中开辟空间,每次new的堆内存地址都不同。
  3. 所以这个要分两种情况去区分,不要单纯的以为就是两个对象

3,String str = new String("a"+"b");

这个地方有坑,javac编译时,会对其优化,变成"ab",不必等到运行期去进行加法运算处理。所以ab是一个对象,其他的就和上边的同理了。

4,String s = new String("a")+b;

分情况,new String("a")可能一个或两个,+b可能一个或没有, new String("a")+b一个,所以两到四个对象。

好的,下面是Java程序的实现: ```java import java.util.ArrayList; class RegistException extends Exception { public RegistException(String message) { super(message); } } class UserRegister { private ArrayList<String> registeredUsers; public UserRegister() { registeredUsers = new ArrayList<String>(); registeredUsers.add("LiMin"); registeredUsers.add("ZhangLei"); registeredUsers.add("WangJun"); } public void regist(String name) throws RegistException { if (registeredUsers.contains(name)) { throw new RegistException("用户名已被注册"); } registeredUsers.add(name); System.out.println("注册成功,欢迎您:" + name); } } public class Main { public static void main(String[] args) { UserRegister register = new UserRegister(); try { register.regist("LiMin"); // 抛出异常 } catch (RegistException e) { System.out.println(e.getMessage()); } try { register.regist("WangXiaoming"); // 注册成功 } catch (RegistException e) { System.out.println(e.getMessage()); } } } ``` 在上面的代码,我们定义了一个名为`RegistException`的自定义异常类,并在`UserRegister`类的`regist`方法抛出该异常。如果用户名已存在,就会抛出该异常;否则,就将用户名添加到集合并输出注册成功的信息。 在`main`方法,我们创建一个`UserRegister`对象并尝试进行两次注册操作。第一次尝试注册一个已存在的用户名,会抛出`RegistException`异常并打印出异常信息;第二次尝试注册一个新的用户名,会成功注册并输出注册成功的信息。 注意,在调用`regist`方法时,我们使用了`try-catch`语句来捕捉可能抛出的异常。如果`regist`方法抛出了`RegistException`异常,就会跳转到`catch`语句块,并打印出异常信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值