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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class  Animal
{
        public void show(){
                System.out.println("show animal");
        }
}

//子类:狗 ,方法 打印属性 ,吃饭
class  Dog extends Animal
{
        public void show(){
                System.out.println("show dog");
        }
        public void eat(){
                System.out.println("狗吃肉");
        }
}

//子类 :猫 方法: 打印属性 ;
class Cat extends Animal
{
        public void show(){
                System.out.println("show cat");
        }
}
//测试类
class  DuoTaiTest2
{
        public static void main(String[] args)
        {
                //多态
                Animal a = new Dog();//向上转型
                a.show();
                System.out.println("分割线-----------");
               
                a = new Dog();
                a.show();
                System.out.println("分割线----------- ");

                Dog b = (Dog) a;//向下转型;
                b.show();
                b.eat();
                System.out.println("分割线-----------");

                Cat c = Cat (a);
                c.show();//编译错误
                Cat c = Cat (b);
                c.show();//运行错误               
        }
}
知道这是为什么吗?

评分

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

查看全部评分

2 个回复

倒序浏览
白月留梦 来自手机 中级黑马 2015-6-18 07:30:36
沙发
只是我的理解:
编译:因为你上面重新定义a=new Dog();
这时编译器已经知道a是一只狗,你把它强转猫,就会编译出错
运行:因为在编译的时候b=Dog(a);编译的时候程序没有执行,还没发生强转,所以还是指向动物的引用,而d又指向b,相当于猫指向动物,所以没有报错。而在运行的时候发觉b已经是只狗!狗转猫,所以错误
回复 使用道具 举报
白月留梦 发表于 2015-6-18 07:30
只是我的理解:
编译:因为你上面重新定义a=new Dog();
这时编译器已经知道a是一只狗,你把它强转猫,就会编 ...

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