黑马程序员技术交流社区

标题: 基础代码,关于数组的,求解释? [打印本页]

作者: 陈琦    时间: 2012-10-21 00:13
标题: 基础代码,关于数组的,求解释?
本帖最后由 陈琦 于 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
        }
}
作者: 马磊    时间: 2012-10-21 00:47
本帖最后由 马磊 于 2012-10-21 01:21 编辑

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

只有把父类型赋给子类型的时候才需要强制类型转换,但是容易出现转换异常,所有就有了instanceof 运算符。
作者: 给生活加点料    时间: 2012-10-21 01:06
Object b = (Object)s;    这里转型只是做了一个强制转换,把数组转成Object类型。   但你接受是数组,所以你转后也应为数组。
作者: 张其辉    时间: 2012-10-21 01:09
好像不可以这样转型吧: b = (Object)s;这个“s”是存储了一个引用地址,并不代表具体内容,b是代表一个Object对象,怎么转?求解释!!!!
况且String类型的数组转Object也不用加“ (Object)”,可以自动转换啊Object b =s;
作者: 新立    时间: 2012-10-21 01:13
我个人的理解,说的不对请改正

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

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


作者: 江苏孙浩    时间: 2012-10-21 09:41
个人理解:
1 Object b = (Object)s;  数组的基类位Object,所以这是向上转型
2 System.out.println(b);  此处调用了toString()方法,但是这个方法是动态绑定的,也就是此处存在多态的问题;由于b实际存储的是数组,所以调用的是数组的toString()方法
3 System.out.println(o); o本为Object,所以调用toString输出的是Object的toString()




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