黑马程序员技术交流社区

标题: 前几天答题时的一个题,关于创建对象的 [打印本页]

作者: hx32    时间: 2013-7-20 16:26
标题: 前几天答题时的一个题,关于创建对象的
本帖最后由 杜光 于 2013-7-21 09:07 编辑

下面代码片段创建()个对象。
1      int a = 10;
2     String b = "abc";
3      String c = new String("abc");
4      MyTest test = new MyTest();

原帖锁了,只能再问一下了
浑浑噩噩,搞不清楚到底什么样才是创建对象。答案我已经知道了,只是思路不懂
1、2中a、b是在栈内存,算不算一个对象。还有10和abc如果堆内存中没有,不是需要建立吗?还是说建立出来的数据不能被称之为对象?
3、4中的C和test也不算对象?new建立的是对象,这个我知道。
麻烦耽误下时间,帮我理一下,谢谢了,困扰好几天了

作者: crazy_primitive    时间: 2013-7-20 16:34
八种基本数据类型要被封装了才能成为对象
作者: wedge    时间: 2013-7-20 16:43
其实对不对象我觉得应该是比较简单的,除了几种基本的数据类型之外,其它创建出来的东东都是java
里面所谓的对象。
String 的实例也是对象。
作者: 月亮人生    时间: 2013-7-20 16:51
1      int a = 10;//int 是基本数据类型,创建的是变量。a是变量 2     String b = "abc";//String是个类,故即使堆内存中有了”abc” ,创建的String对象b不再在堆内存中创建“abc”了,会直接引用已经存在的”abc”。 b是对象 3      String c = new String("abc");//会创建两个对象, new 一个对象和“abc”也是个对象(因为字符串“abc”是String类 的一个实例)  c也是对象 4      MyTest test = new MyTest();//new出来的是对象。Test是对象
总之,就是要先看下是什么数据类型的。若是引用数据类型的就是可以说是对象了。否则就是变量了。
作者: hx32    时间: 2013-7-20 16:56
月亮人生 发表于 2013-7-20 16:51
1      int a = 10;//int 是基本数据类型,创建的是变量。a是变量 2     String b = "abc";//String是个类 ...

答案是三个。
应该是C,abc,test。好像是这么回事,因为答题时3个是正确答案,但是是哪三个没人解释
作者: 月亮人生    时间: 2013-7-20 17:07
hx32 发表于 2013-7-20 16:56
答案是三个。
应该是C,abc,test。好像是这么回事,因为答题时3个是正确答案,但是是哪三个没人解释 ...

第一个不是对象,int是基本数据类型,a是变量。
第二个和第三个是String类型的,是类String的实例,可以说是b和c是对象了。
第四个是自定义的类,也可以说是test是对象 了。

就是引用数据类型创建的 是对象。基本数据类型创建的就是变量。
作者: xscn    时间: 2013-7-20 17:18
本帖最后由 xscn 于 2013-7-20 19:07 编辑

创建字符串的方式
1.用new关键字创建字符串。比如String s1 = new String("abc");
2.直接指定值。比如String s2 = "abc";String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。

用任何方式来创建一个字符串对象s时,Java运行时会拿着这个X在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。
Java中,只要使用new关键字来创建对象,则一定会堆创建一个新的对象。
直接指定创建String对象,仅会检查维护String池中的字符串,池中没有就在池中创建一个,但绝不会在堆栈区再去创建该String对象。

举例子
  String a1="abc";  生成一个池中的对象abc
  String a2="abc";  不会新生成对象,因为池中已经有abc了
  String a3="abcd";  生成一个池中新对象abcd
  总共创建2个String对象都在String池中。

  String a1=new String("abc");  生成两个新对象,池中一个,堆内存中一个
  String a2=new String("abc");  生成一个新对象,堆中,引用池中的abc
  String a3=new String("abcd");  生成两个新对象,池中一个,堆内存中一个

1      int a = 10;//定义一个变量a赋值10,没有创建对象
2     String b = "abc";//生成一个池中字符串对象“abc”,b是放在栈内存中的引用,引用不是对象-------1个
3      String c = new String("abc");//new String()所以要在堆中创建新的空间,在池中搜索与abc相同值的对象,因为有所以不再在池中创建abc对象,只是把池中的对象复制到堆中并在堆中创建一个对象,并返回堆的引用地址给c ,c不是对象,c中只存储了返回的地址的变量。----1个
4      MyTest test = new MyTest();//new一个MyTest类型的对象------1个

作者: hx32    时间: 2013-7-20 17:43
xscn 发表于 2013-7-20 17:18
创建字符串的方式
1.用new关键字创建字符串。比如String s1 = new String("abc");
2.直接指定值。比如Strin ...

栈中有没有出现对象的情况?有的话麻烦解答
因为看到好像都是堆或者String池(这个名词是第一次见到)中创建了对象,而栈内存中都是引用对象的变量
作者: xscn    时间: 2013-7-20 17:51
hx32 发表于 2013-7-20 17:43
栈中有没有出现对象的情况?有的话麻烦解答
因为看到好像都是堆或者String池(这个名词是第一次见到)中 ...

java中的对象存储分为基本类型和对象,基本类型直接存储在栈中,对象存储在堆中,对对象的引用也存储在栈中
作者: hx32    时间: 2013-7-20 18:06
xscn 发表于 2013-7-20 17:51
java中的对象存储分为基本类型和对象,基本类型直接存储在栈中,对象存储在堆中,对对象的引用也存储在栈 ...

哦,谢谢。
就是说栈中是不会出现对象的。
没有加技术分的功能……确实帮助很大,非常感谢
作者: xscn    时间: 2013-7-20 18:12
hx32 发表于 2013-7-20 18:06
哦,谢谢。
就是说栈中是不会出现对象的。
没有加技术分的功能……确实帮助很大,非常感谢 ...

我也是找了很多资料,参考着自己的理解来回答的,共同进步嘛呵呵
作者: hx32    时间: 2013-7-20 18:48
呼叫版主,封贴,麻烦了,谢谢
作者: 杜光    时间: 2013-7-21 09:04
楼主你好  如果帖子的问题已经解决,请把帖子的类型改为“已解决”。




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