黑马程序员技术交流社区

标题: 很有意思的一个问题--下面这个语句产生了几个对象 [打印本页]

作者: wq10zj    时间: 2014-2-9 13:22
标题: 很有意思的一个问题--下面这个语句产生了几个对象
请问上下面的语句一共生成了几个对象?

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

作者: 箬竹小筑    时间: 2014-2-9 16:53
我认为是一个对象
作者: 周昭民    时间: 2014-2-9 17:24
  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的视频里面有讲过这件事。你问的问题的答案是一个对象。可以参考一下我的代码,你只要记住,字符串被创建就不可更改。
作者: itpower    时间: 2014-2-9 19:05
只有一个“a”String对象啊 ,s只是这个对象的一个引用,所以我觉得只有一个对象!
作者: 嘿╰_╯往哪里跑    时间: 2014-2-10 09:06
public String toString() {
return this;
    }
返回的是当前对象,所以应该是产生两个对象。
作者: 潘金锋    时间: 2014-2-10 20:59

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

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

生成了两个对象
一个字符串对象“a”
一个String对象
作者: 袁梦希    时间: 2014-2-10 21:23
不错    如果不懂继续追问
作者: 奋斗的小胖子    时间: 2014-2-11 09:45
两个对象?一个是原来的String  S对象, 一个是调用toString方法返回的对象?
作者: 嗯√低调〆    时间: 2014-2-11 12:04
String s = "a",String s = new String("a"); s只创建一次,下面的输出方法调用的是该对象的方法
作者: skyname    时间: 2014-2-11 12:20
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了。


作者: 李金中    时间: 2014-2-11 14:44
不对吧。
String s = "a",不是 new String("a");
"a"是字符串常量, 只是声明一个指向它的s。如果 是 String s = new String("a");
是申请了栈空间去创建一个String对象,然后把s指向该对象。至于“a”这个字符串常量对象,是存储在常量区。
地址存储地方都不相同。

.toString方法,看了下API,是返回本身,也就是说 去读取常量区的“a”,所以按楼主的代码,应该始终就一个常量字符串对象
作者: 李金中    时间: 2014-2-11 14:51
有一句话说错了,用new申请的是堆空间。。不是栈,不好意思。这块我觉得可以参考C,感兴趣的话




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2