黑马程序员技术交流社区

标题: 一个是编译错误 一个是运行错误,细节不一样 [打印本页]

作者: lizhi1817    时间: 2015-6-18 01:55
标题: 一个是编译错误 一个是运行错误,细节不一样
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();//运行错误               
        }
}
知道这是为什么吗?

作者: 白月留梦    时间: 2015-6-18 07:30
只是我的理解:
编译:因为你上面重新定义a=new Dog();
这时编译器已经知道a是一只狗,你把它强转猫,就会编译出错
运行:因为在编译的时候b=Dog(a);编译的时候程序没有执行,还没发生强转,所以还是指向动物的引用,而d又指向b,相当于猫指向动物,所以没有报错。而在运行的时候发觉b已经是只狗!狗转猫,所以错误
作者: lizhi1817    时间: 2015-6-19 01:17
白月留梦 发表于 2015-6-18 07:30
只是我的理解:
编译:因为你上面重新定义a=new Dog();
这时编译器已经知道a是一只狗,你把它强转猫,就会编 ...

是的




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