黑马程序员技术交流社区

标题: 这两段小代码有什么区别? [打印本页]

作者: 杨千里    时间: 2012-9-4 01:16
标题: 这两段小代码有什么区别?
本帖最后由 杨千里 于 2012-9-14 19:53 编辑

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

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

这两段小代码有什么区别?哪端代码更好一点
作者: 史龙贤    时间: 2012-9-4 01:26
这两段代码表达的意思是一样的,第一个首先new出一个对象p,然后再给p的age赋一个初值25,再就是调用study()方法。第二种表示采用匿名的方式,这样可以简化代码,也就是说把对象的名字隐藏起来。
作者: 杨习平    时间: 2012-9-4 01:41

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

代码2
new Person().age =25;
new Person().study();
这两段代码中,第一种是在实例化的时候相当在内存里里开辟了两个对象,一个是 p ,一个是  new Person();他们在内存中指向的是同一个地址值,当调用
p时,Person();就相当于是没被利用,有时会被GC清理,当然第二种方式是一个对象的实例化和调用方法,这个方法占内存小,不浪费资源。
作者: 刘明月    时间: 2012-9-4 02:15
例1只创建了一个对象,而例2创建了两个对象,
例1是给这一个对象的年龄赋值,然后调用该对象的study()方法,
例2是给其中一个对象的年龄赋值,调用另外一个对象的study()方法,

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

例1内存图

例1内存图

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

例2的内存图

例2的内存图

作者: 刘明月    时间: 2012-9-4 02:17
例2中的new Person().age=20赋完值后就没用变为垃圾了,所以说匿名对象一般用来调用函数
作者: 武庆东    时间: 2012-9-4 07:48
杨习平 发表于 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都是都会开辟一块内存空间哟!
作者: 王陶成    时间: 2012-9-4 09:10
第一段代码是new出一个p,然后再通过p的age赋值25,然后调用study方法,这种方式中,Person p存在于在栈内存中, new Person()在堆内存中开辟了空间,也可以说是开辟了两个空间。
第二种方式是匿名对象,它只在堆内存中开辟了空间,但是当运行到new Person().study()这一句,new Person().age在内存中就成了垃圾,就算给它赋了值,到后面也不会调用到。所以说你们对象调用属性没意义,调用方法有意义,拿匿名对象调用方法很方便。
作者: 孙岳    时间: 2012-9-4 11:13
第一种是在栈内存中开辟一块空间,取个名字叫p,在堆内存中开辟一块空间,创建一个Person对象,然后把该对象的地址赋给p,也就是让p引用这个对象,可以长期通过p来操作这个对象。
第二种没有涉及到栈内存,只是在堆内存中创建了两个匿名对象,一个给age赋值,一个调用study方法,是一次性的,用完就变成了垃圾,会被java虚拟机清理掉。
作者: 杨千里    时间: 2012-9-4 13:53
问题已经解决      4楼   正解




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