黑马程序员技术交流社区
标题:
一个是编译错误 一个是运行错误,细节不一样
[打印本页]
作者:
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