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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈琦 中级黑马   /  2012-10-21 00:13  /  1362 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈琦 于 2012-10-30 11:56 编辑

public class TestFiled {
        public static void main(String[] args) {
                String s [] = new String[] {"1","2","4","4"};
                Object b = (Object)s;                //这里不是向上转型的话,那是什么??
                Object o = new Object();        
                System.out.println(b);                //打印结果::[Ljava.lang.String;@70a0afab  为什么打印的不是Object??
                System.out.println(o);                //打印结果::java.lang.Object@456d3d51
        }
}

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 赞一个!

查看全部评分

5 个回复

正序浏览
个人理解:
1 Object b = (Object)s;  数组的基类位Object,所以这是向上转型
2 System.out.println(b);  此处调用了toString()方法,但是这个方法是动态绑定的,也就是此处存在多态的问题;由于b实际存储的是数组,所以调用的是数组的toString()方法
3 System.out.println(o); o本为Object,所以调用toString输出的是Object的toString()

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 很给力!

查看全部评分

回复 使用道具 举报
我个人的理解,说的不对请改正

s是一个数组,而数组本事也是对象,所以Object b = (Object)s;这句不用强制转换,Object b = s;  就可以了,应该是向上转型

在说打印b为什么不是Object,原因是Object b = s;,这句话是把s的值赋给 b,而s中存储的是String[]的引用地址,也就是说,b中存储的也是String[]的引用地址。这个语句执行完成之后就是的b和s都指向了一块内存地址。所以打印出来的结果不是Object,而是和s一样的数组的地址

回复 使用道具 举报
好像不可以这样转型吧: b = (Object)s;这个“s”是存储了一个引用地址,并不代表具体内容,b是代表一个Object对象,怎么转?求解释!!!!
况且String类型的数组转Object也不用加“ (Object)”,可以自动转换啊Object b =s;
回复 使用道具 举报
Object b = (Object)s;    这里转型只是做了一个强制转换,把数组转成Object类型。   但你接受是数组,所以你转后也应为数组。
回复 使用道具 举报
本帖最后由 马磊 于 2012-10-21 01:21 编辑

Object b = (Object)s;                //这里不是向上转型的话,那是什么??
这里是向上转型,但是没有必要在这里做类型转换,(Object)s 之后s还是字符串数组类型,它本身没有改变。
向上转型是子类对象赋给父类引用, b在编译的时候被当成是Object类,你可以测试一下使用b.length()方法,编译器会告诉你Object类的b是没有这个方法的。
但是在运行的时候,JVM又会把b看作是字符串数组类型。

只有把父类型赋给子类型的时候才需要强制类型转换,但是容易出现转换异常,所有就有了instanceof 运算符。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马