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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张青峰 黑马帝   /  2012-2-2 22:49  /  2240 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

各位大侠:怎样获得一个类中的一个对象的名字?比如有如下程序:
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
应该怎样修改程序,向各位请教?谢谢

评分

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

查看全部评分

8 个回复

倒序浏览
getClass().getName()是返回的是类的名称,不是对象,
而且a和b也不是对象的名称,
是类变量对对象的引用,
对象存在内存里面唯一独一无二的名称就是它的地址,
类变量a,b持有它们的地址
就算是对象的hash值也是可以相同的。
所以没有传统的名称咯

评分

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

查看全部评分

回复 使用道具 举报
this.getClass()得到的都是Person.class,无论是哪个对象传进去。

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

它们的名称是没办法让talk来调用的。

评分

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

查看全部评分

回复 使用道具 举报
哦 非常感谢
回复 使用道具 举报
哦 非常感谢
回复 使用道具 举报
我觉得对象的名字应该是对象的属性吧。你是不是把对象的引用名想成是对象的名字了。
回复 使用道具 举报
易伟 黑马帝 2012-2-4 11:33:06
7#
魑_魅 发表于 2012-2-4 08:05
我觉得对象的名字应该是对象的属性吧。你是不是把对象的引用名想成是对象的名字了。 ...

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

评分

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

查看全部评分

回复 使用道具 举报
易伟 发表于 2012-2-4 11:33
假如有一个Person类,用Person类创建一个实例对象:
Person p = new Person("张三","20");这样在堆内 ...

知道了,受教
回复 使用道具 举报
王_涛 黑马帝 2012-2-4 15:35:37
9#
1.this.getClass()获得的是当前对象的类对象,等到的类对象调用this.getClass().getName()获得类对象的类名Person

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

评分

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

查看全部评分

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