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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhangx 中级黑马   /  2013-4-14 12:20  /  1384 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 zhangx 于 2013-4-16 14:49 编辑

为什么在对象向下转型前必须先发生向上转型?
即为什么第一个代码正确,第二个错误?
class A{                                        // 定义类A
        public void fun1(){                // 定义fun1()方法
                System.out.println("A --> public void fun1(){}") ;
        }
        public void fun2(){
                this.fun1() ;                // 调用fun1()方法
        }
};
class B extends A{
        public void fun1(){                // 此方法被子类覆写了
                System.out.println("B --> public void fun1(){}") ;
        }
        public void fun3(){
                System.out.println("B --> public void fun3(){}") ;
        }
};
正确的
public class Demo01{
        public static void main(String asrgs[]){
                A a = new B() ;                        // 向上转型关系
                B b = (B)a ;                // 发生了向下转型关系
                b.fun1() ;
                b.fun2() ;
                b.fun3() ;
        }
};
错误的
public class Demo02{
        public static void main(String asrgs[]){
                A a = new A() ;                        // 实例化了一个父类对象
                B b = (B)a ;                // 发生了向下转型关系
                b.fun1() ;
                b.fun2() ;
                b.fun3() ;
        }
};

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 ①人←①城市 于 2013-4-14 12:36 编辑


A a = new B() ;这个时候是明显告诉A,我有个子类是B.所以是正确的.
A a = new A() ;这个时候A是不知道有个子类B.所以是错误的.
只有B才知道自己的父类是A.

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 J_hom 于 2013-4-14 12:38 编辑

注意的是编译时没有出现错误,但运行结果出现异常。

Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B

因为是通过父类A进行实例化对象的,然后再对象向下转型。

因为单独看父类A是找不到的任何关系的,A a=new A(), B b=(B)a只不过是将a 强制转换成B类型,A,B类根本就没有关系。然而通过子类B他可以找到父类A的,从而确定了它们之间的关系。所以说要确定向下转型

首先是确定向上转型关系。A a=new B();

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
最需要关心的一定是对象!!
你new的是A类对象还是B类对象
在第一种情况中,你new的是B类对象,也就是子类对象,但是你把A类的引用指向了B类对象,之所以可以这么做是因为B类对象本来就是A类对象的子类,也就是说B类对象本身“is a”A类的事物,就像毕老师所说,你要一个动物(父类),我给你拿来一个猫(子类实体),这就是向上转型,如果你拿着这个动物(父类)要捉老鼠(子类特有功能),你就不能再把它称作“动物”(父类引用),你得叫它“猫”(子类引用),这就是向下转型,这就是第一种情况的现实模拟!!!
在第二种情况中,你new的是一个A类对象,也就是父类对象,但是明显A类对象不“is a”B类事物,你要一个动物(A类),我就给你随便拿来一个动物(A类实体),如果你想要这个动物捉老鼠(A类不具备的方法),难道你能把这个动物称作“猫”?然后说,我叫你猫你就得是猫,你去给我捉老鼠!!!当然不符合现实情况
你面向的是对象!!首先要看下对象本身是什么
至于在内存中实现的机制,我也在苦苦思考,之后我也得把内存里面的这个问题整理出来。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

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