
下面的java代码在运行时总共创建了()个对象
publicclassDemo{publicvoidmakeObject(){Strings1,s2="abc";Object01=S2;Demodemo1;Demode...
public class Demo
{
public void makeObject()
{
String s1,s2="abc";
Object 01=S2;
Demo demo1;
Demo demo2=new Demo();
}
}
public static void main(String[] args)
{
new Demo().makeObject();
}
还请大师详细解释解释,如果有人很了解这个,我想加你一下,我很想弄明白,现在遇到这种题目头就大!
回答者 arkiarx 2+1=3呢,你的答案是3个对象吧?
我在网上发现这个网址http://hi.baidu.com/kill_me/blog/item/ecc08534f6f6e6bbd1a2d361.html
这个里面讲得对不?我想加你为好友,你好好给我讲讲呗!
其他答案我认为不靠谱 展开
{
public void makeObject()
{
String s1,s2="abc";
Object 01=S2;
Demo demo1;
Demo demo2=new Demo();
}
}
public static void main(String[] args)
{
new Demo().makeObject();
}
还请大师详细解释解释,如果有人很了解这个,我想加你一下,我很想弄明白,现在遇到这种题目头就大!
回答者 arkiarx 2+1=3呢,你的答案是3个对象吧?
我在网上发现这个网址http://hi.baidu.com/kill_me/blog/item/ecc08534f6f6e6bbd1a2d361.html
这个里面讲得对不?我想加你为好友,你好好给我讲讲呗!
其他答案我认为不靠谱 展开
展开全部
我来终结这个问题吧:
1.一共只有三个对象
2.new Demo().makeObject()一个
3.String s1,s2="abc";只有【一个】,等会解释
4.Demo demo2=new Demo();一个
解释: String s1,s2="abc";这里是创建一个【常量池】对象和两个个常量池引用。头晕了?其实就是这样的,先到常量池里面分配一个区域,其值为字符串"abc",注意,它本身就是在常量池里面的一个对象,然后s1,s2指向它,得到的是"abc"这个常量池对象的引用。
###########################################################
既然你要知道这方面的东西,那我再分析下String s=new String("abc");的问题吧。
这里先是发现"abc"这个字符串,然后到常量池里面开一个常量池对象,然后由于用到了new,就到【堆】也就是heap中开辟一块空间给s,所以一下有了两个对象:常量池对象"abc"和堆对象s
###########################################################
还没晕?那好,再讲点常量池和堆得问题:
public class Test {
private static String a = "ab";
public static void main(String[] args){
String s1 = "a";
String s2 = "b";
String s = s1 + s2;
System.out.println(s == a);//false
System.out.println(s.intern() == a);//true
}
}
顺便提一下
String s1 = "a";
String s2 = "b";
String s = s1 + s2;
这里是3个对象,"a","b"和s,前两个是常量池对象,最后一个是堆对象。
这个例子主要说明堆和常量池的差别。s==a为何不对?因为直接 String a = "ab";是在常量池里面开辟一个对象"abc"(当然了,a指向这个对象),而String s=s1+s2;中s是在堆中开辟的对象,一个【常量池对象】当然和一个【堆对象】不同了(这里涉及到另外一个深度问题:就是==,equals和hashcode的问题,这里==是比较地址,堆上面的东西和常量池里面的东西地址当然不同了)。
但是,用s.intern() == a;就是对的了,是因为intern会指向常量池地址,由于前面已经在常量池中有了一个"ab",那么String s=s1+s2;实际上是在堆中创建对象s,但是s指向常量池中的"ab",s.intern()和a都指向常量池中的"ab"对象了,当然就是true了。
###########################################################
手麻了,这些有深度的问题,不一定好了解,慢慢体会才行的了。。。
1.一共只有三个对象
2.new Demo().makeObject()一个
3.String s1,s2="abc";只有【一个】,等会解释
4.Demo demo2=new Demo();一个
解释: String s1,s2="abc";这里是创建一个【常量池】对象和两个个常量池引用。头晕了?其实就是这样的,先到常量池里面分配一个区域,其值为字符串"abc",注意,它本身就是在常量池里面的一个对象,然后s1,s2指向它,得到的是"abc"这个常量池对象的引用。
###########################################################
既然你要知道这方面的东西,那我再分析下String s=new String("abc");的问题吧。
这里先是发现"abc"这个字符串,然后到常量池里面开一个常量池对象,然后由于用到了new,就到【堆】也就是heap中开辟一块空间给s,所以一下有了两个对象:常量池对象"abc"和堆对象s
###########################################################
还没晕?那好,再讲点常量池和堆得问题:
public class Test {
private static String a = "ab";
public static void main(String[] args){
String s1 = "a";
String s2 = "b";
String s = s1 + s2;
System.out.println(s == a);//false
System.out.println(s.intern() == a);//true
}
}
顺便提一下
String s1 = "a";
String s2 = "b";
String s = s1 + s2;
这里是3个对象,"a","b"和s,前两个是常量池对象,最后一个是堆对象。
这个例子主要说明堆和常量池的差别。s==a为何不对?因为直接 String a = "ab";是在常量池里面开辟一个对象"abc"(当然了,a指向这个对象),而String s=s1+s2;中s是在堆中开辟的对象,一个【常量池对象】当然和一个【堆对象】不同了(这里涉及到另外一个深度问题:就是==,equals和hashcode的问题,这里==是比较地址,堆上面的东西和常量池里面的东西地址当然不同了)。
但是,用s.intern() == a;就是对的了,是因为intern会指向常量池地址,由于前面已经在常量池中有了一个"ab",那么String s=s1+s2;实际上是在堆中创建对象s,但是s指向常量池中的"ab",s.intern()和a都指向常量池中的"ab"对象了,当然就是true了。
###########################################################
手麻了,这些有深度的问题,不一定好了解,慢慢体会才行的了。。。
展开全部
首先你要搞清楚String类型 创建时候的,如果只是String str = "abc"
那么先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。
所以 String s1,s2="abc"; 这句话只是创建了一个对象,s1和s2指向同一个地方
用String s = "a"过程其实和int i = 5 是差不多的
而用new()就不同了,有几个new(),就创建了几个对象
那么先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。
所以 String s1,s2="abc"; 这句话只是创建了一个对象,s1和s2指向同一个地方
用String s = "a"过程其实和int i = 5 是差不多的
而用new()就不同了,有几个new(),就创建了几个对象
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
本人觉得是创建了 4 个对象
首先在主函数中创建了一个Demo对象,
在makeObject函数中 String s1,s2="abc";创建了两个对象
Object 01=S2;没有创建对象
Demo demo1;没有创建对象
Demo demo2=new Demo();创建了一个对象
所以总共是 4 个
首先在主函数中创建了一个Demo对象,
在makeObject函数中 String s1,s2="abc";创建了两个对象
Object 01=S2;没有创建对象
Demo demo1;没有创建对象
Demo demo2=new Demo();创建了一个对象
所以总共是 4 个
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
要说创建的话 只有2个 Demo和Demo2
其他的String s1,s2之类的只是变量而已 Object也是,Demo demo1只是定义一个Demo类, 还没被创建
其他的String s1,s2之类的只是变量而已 Object也是,Demo demo1只是定义一个Demo类, 还没被创建
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
3个:主函数里new Demo();,“abc”,makeObject方法里new Demo()
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |