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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 沈文杰 中级黑马   /  2013-2-28 11:37  /  1570 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 沈文杰 于 2013-2-28 20:47 编辑

javaBean问题

public class IntroSpectorTest {
        public static void main(String[] args) throws Exception{
                ReflectPoint pt1 = new ReflectPoint(3,5);
                //定义属性值。
                String propertyName = "x";

                PropertyDescriptor dp = new PropertyDescriptor(propertyName,pt1.getClass());
                Method methodGetX = dp.getReadMethod();
                Object retVal = methodGetX.invoke(pt1);

                System.out.println(retVal);
        
        }
}
//retVal不是Object类型的么?为什么打印结果是3而不是一个内存地址hash值我们复写了ReflectPoint中的toString
方法,但是这里调用的不是Object中的toString方法么?

同理看下面

public class StringTest {
        public static void main(String[] args)
        {
                String s = "abc";
               
                Object obj = "abc";

                System.out.println(s);
                System.out.println(obj);
        //运行结果都是abc
        }
}
//Object obj = "abc";这里是不是用到了自动装箱功能?为什么打印的出来的是abc,而不是内存地址hash值

评分

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

查看全部评分

3 个回复

倒序浏览
1、Object retVal = methodGetX.invoke(pt1);这句话是调用反射出来的类的方法,这个方法返回值是个int型,用object接收下,避免报错
然后System.out.println(retVal);是打印这个参数的值,而不是ReflectPoint的值,所以你复写了ReflectPoint的toString方法当然没效果
2、其实String这个类对toString()和hashCode() 这2个方法都有复写,你是得不到地址值的。
虽然你使用的父类的引用,但是在打印的时候,由于子类有复写方法,使用的还是子类的toString()方法

评分

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

查看全部评分

回复 使用道具 举报
Object obj = "abc";中的字符串"abc",是String类的一个实例对象,
这条语句的意思是:把Object的一个引用名obj指向"abc"字符串,也就是说obj这地址上的内容是"abc"的地址;
那么当执行 System.out.println(obj);执行"abc"这个字符串中的toString方法

1、自动装箱是发生在基本类型与基本类的引用类型(基本类型的包装类型),
API文档:Integer 类在对象中包装了一个基本类型 int 的值。Integer 类型的对象包含一个 int 类型的字段。
2、你所说就应该是向上转型而不装箱,它发生在子父类之间;

地址.png (5.88 KB, 下载次数: 45)

地址.png

评分

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

查看全部评分

回复 使用道具 举报
哦 ,谢谢你们的回答,我懂了,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马