黑马程序员技术交流社区

标题: 怎样获得对象的名字 [打印本页]

作者: 张青峰    时间: 2012-2-2 22:49
标题: 怎样获得对象的名字
各位大侠:怎样获得一个类中的一个对象的名字?比如有如下程序:
public class Person {
String name;
void talk(){
         System.out.println(this.getClass().getName()+"的名字"+this.name);
}
public static void main(String[] args){
         Person a= new Person();
         a.name="123";
         Person b= new Person();
         b.name="33";
         a.talk();
         b.talk();
}
}
现在的运行结果是:
Person的名字123
Person的名字33

我想让他的运行结果是:
a的名字123
b的名字33
应该怎样修改程序,向各位请教?谢谢
作者: 彭嘉聪    时间: 2012-2-2 23:00
getClass().getName()是返回的是类的名称,不是对象,
而且a和b也不是对象的名称,
是类变量对对象的引用,
对象存在内存里面唯一独一无二的名称就是它的地址,
类变量a,b持有它们的地址
就算是对象的hash值也是可以相同的。
所以没有传统的名称咯
作者: 陈丹阳    时间: 2012-2-2 23:04
this.getClass()得到的都是Person.class,无论是哪个对象传进去。

a变量和b变量是在main函数的局部变量而已,分别指向两个Person对象。

它们的名称是没办法让talk来调用的。
作者: 张青峰    时间: 2012-2-3 09:01
哦 非常感谢
作者: 张青峰    时间: 2012-2-3 09:02
哦 非常感谢
作者: 黑马唐浩    时间: 2012-2-4 08:05
我觉得对象的名字应该是对象的属性吧。你是不是把对象的引用名想成是对象的名字了。
作者: 易伟    时间: 2012-2-4 11:33
魑_魅 发表于 2012-2-4 08:05
我觉得对象的名字应该是对象的属性吧。你是不是把对象的引用名想成是对象的名字了。 ...

假如有一个Person类,用Person类创建一个实例对象:
Person p = new Person("张三","20");这样在堆内存中就开辟了一块空间存放着这个对象的属性和方法,
但是p是什么呢?p是这个对象的引用变量名而已,它存放于栈内存中,存放的是这个对象在堆中的地址值,这样就指向了这个对象。你可以说p就是这个对象的名字,但是你要搞清楚的是p存放的是地址值,不是字符或字符串p。
但是你说对象的名字应该是对象的属性,那张三和20都属于对象的属性,你可能片面的理解为张三就是对象名了吧。但是假如我再实例一个对象Person p1 = new Person("张三","21");这两个张三的意义就不同了,它们属于两个不同的对象。所以不能用对象的属性来命名对象,但是它们的地址值肯定是不一样的。你要抛弃传统的观念觉得对象就应该有个名字来区别,其实真正区别对象的是它们存放的地址,就如同在监狱里犯人都不叫名字而叫编号是一样的。
作者: 黑马唐浩    时间: 2012-2-4 12:28
易伟 发表于 2012-2-4 11:33
假如有一个Person类,用Person类创建一个实例对象:
Person p = new Person("张三","20");这样在堆内 ...

知道了,受教
作者: 王_涛    时间: 2012-2-4 15:35
1.this.getClass()获得的是当前对象的类对象,等到的类对象调用this.getClass().getName()获得类对象的类名Person

2.a为Person类型变量的一个引用,可以是符合命名规范的任意字符串,难以获取。




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