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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨千里 中级黑马   /  2012-9-4 01:16  /  1910 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨千里 于 2012-9-14 19:53 编辑

代码1
Person p= new Person();
p.age = 25;
p.study();

代码2
new Person().age =25;
new Person().study();

这两段小代码有什么区别?哪端代码更好一点

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 鼓励一下!

查看全部评分

8 个回复

正序浏览
问题已经解决      4楼   正解
回复 使用道具 举报
第一种是在栈内存中开辟一块空间,取个名字叫p,在堆内存中开辟一块空间,创建一个Person对象,然后把该对象的地址赋给p,也就是让p引用这个对象,可以长期通过p来操作这个对象。
第二种没有涉及到栈内存,只是在堆内存中创建了两个匿名对象,一个给age赋值,一个调用study方法,是一次性的,用完就变成了垃圾,会被java虚拟机清理掉。
回复 使用道具 举报
第一段代码是new出一个p,然后再通过p的age赋值25,然后调用study方法,这种方式中,Person p存在于在栈内存中, new Person()在堆内存中开辟了空间,也可以说是开辟了两个空间。
第二种方式是匿名对象,它只在堆内存中开辟了空间,但是当运行到new Person().study()这一句,new Person().age在内存中就成了垃圾,就算给它赋了值,到后面也不会调用到。所以说你们对象调用属性没意义,调用方法有意义,拿匿名对象调用方法很方便。
回复 使用道具 举报
杨习平 发表于 2012-9-4 01:41
代码1
Person p= new Person();
p.age = 25;

这个好像有点不对哟,我认为:Person p=new Person(),在内存中开辟了一个对象两块内存控件!Person p 只是在栈内存中定义对象为Person引用的变量,因此没有创建对象!当new Person()时才在堆内存中开辟空间初始化实例对象的属性和方法,将给对象堆中的地址赋值给p!这点好像把 String s=new String("abc")弄混了哟!String s=new String("abc");如果常量池中已经有了“abc”,那么就新建了一个对象!如果常量池没有“abc”,那么就是创建了两个对象,这两个对象,这两个对象存在堆和栈中! 栈中不保存对象,只保存对象的引用,就是堆中的地址!
第二个代码是两个对象有,每一个new都是都会开辟一块内存空间哟!
回复 使用道具 举报
例2中的new Person().age=20赋完值后就没用变为垃圾了,所以说匿名对象一般用来调用函数
回复 使用道具 举报
例1只创建了一个对象,而例2创建了两个对象,
例1是给这一个对象的年龄赋值,然后调用该对象的study()方法,
例2是给其中一个对象的年龄赋值,调用另外一个对象的study()方法,

1.PNG (15.59 KB, 下载次数: 28)

例1内存图

例1内存图

2.PNG (17.43 KB, 下载次数: 28)

例2的内存图

例2的内存图

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

回复 使用道具 举报

代码1
Person p= new Person();
p.age = 25;
p.study();

代码2
new Person().age =25;
new Person().study();
这两段代码中,第一种是在实例化的时候相当在内存里里开辟了两个对象,一个是 p ,一个是  new Person();他们在内存中指向的是同一个地址值,当调用
p时,Person();就相当于是没被利用,有时会被GC清理,当然第二种方式是一个对象的实例化和调用方法,这个方法占内存小,不浪费资源。
回复 使用道具 举报
这两段代码表达的意思是一样的,第一个首先new出一个对象p,然后再给p的age赋一个初值25,再就是调用study()方法。第二种表示采用匿名的方式,这样可以简化代码,也就是说把对象的名字隐藏起来。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马