A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

请问上下面的语句一共生成了几个对象?

String s = "a";
System.out.println(s.toString());

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

12 个回复

倒序浏览
String s = "a";//此句话等于String s = new String("a");此时在堆内存中创建了一个对象
System.out.println();这句话是不能创建对象,关键是看里面的内容
s.toString();//对象S调用toString()方法,“a"是引用类型的String,而最后生成的结果还是String类型的“a"
所以我认为是只生成了一个对象

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
我认为是一个对象
回复 使用道具 举报
  1. public static void main(String args[]){
  2.                         String s1="abc";//s1是一个类类型变量,"abc"是一个对象。
  3.                                                         //字符串最大特点:一旦被初始化就不可以被改变。
  4.                         String s2=new String("abc");
  5.                         /*
  6.                         s1和s2有什么区别?
  7.                         s1代表一个对象"abc"
  8.                         s2代表两个对象 (new String()和"abc")
  9.                         */
  10. //        s1="kk";                //"abc"内容没有变化过,s1只是指向了一个新的对象"kk"
  11.            }
复制代码



哥们是想问String s ="a";和String s=new String("a");的区别的吧。在毕向东老师第13天01的视频里面有讲过这件事。你问的问题的答案是一个对象。可以参考一下我的代码,你只要记住,字符串被创建就不可更改。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
只有一个“a”String对象啊 ,s只是这个对象的一个引用,所以我觉得只有一个对象!

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
public String toString() {
return this;
    }
返回的是当前对象,所以应该是产生两个对象。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报

请问上下面的语句一共生成了几个对象?

String s = "a";
System.out.println(s.toString());

生成了两个对象
一个字符串对象“a”
一个String对象

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 赞一个!

查看全部评分

回复 使用道具 举报
不错    如果不懂继续追问
回复 使用道具 举报
两个对象?一个是原来的String  S对象, 一个是调用toString方法返回的对象?
回复 使用道具 举报
String s = "a",String s = new String("a"); s只创建一次,下面的输出方法调用的是该对象的方法
回复 使用道具 举报
String s = "a";
System.out.println(s.toString());
String  s,这句是建立了一个String类型的引用s,赋值号右边的“a”实际上就是new String("a"),此时在堆内存中创建了一个对象,引用s指向这个对象。s.toString()是调用Object类中的toString()方法将s所指向的对象中的内容转换成字符串的形式,最后再输出,所以,在这里,在输出语句中写s.toString()和s,效果是一样的。System.out.println();
打印引用类型,默认的就调用对象的toString()方法
Sysout.out是一个PrintStream对象,print方法中有一个重载是
public void print(Objcet o) {
  write(String.valueOf(o));
}

public static String valueOf(Object obj) {
  return (obj == null) ? "null" : obj.toString();
}

这就是System.out.print的实现过程。

注意,在传的参数不是String的时候,会调用String.value的各种重载把Long、Double等类型的对象转成String。在参数是String的时候,就不会这么麻烦,而是直接write了。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
不对吧。
String s = "a",不是 new String("a");
"a"是字符串常量, 只是声明一个指向它的s。如果 是 String s = new String("a");
是申请了栈空间去创建一个String对象,然后把s指向该对象。至于“a”这个字符串常量对象,是存储在常量区。
地址存储地方都不相同。

.toString方法,看了下API,是返回本身,也就是说 去读取常量区的“a”,所以按楼主的代码,应该始终就一个常量字符串对象
回复 使用道具 举报
有一句话说错了,用new申请的是堆空间。。不是栈,不好意思。这块我觉得可以参考C,感兴趣的话
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马