教程中animal向dog的向下转换是不是一个特例?

来源:10-2 多态中的引用类型转换

慕尼黑2980719

2016-07-18 11:14

如果这样写:

Animal animal = new Animal();

Dog dog = (Dog)animal;

运行的时候会报错

而教程的例子中是先创建dog,让animal指向它,再创建dog2的时候才能用(Dog)animal赋值。

所以教程中的例子是不是一个特例?一般情况下应该是不能将父类实例强制转换成子类引用的吧?

写回答 关注

5回答

  • 元素滴3579866
    2016-07-23 22:53:33
    已采纳

    你创建的是父类方法,你看看子类有多少个,系统无法识别指向哪一个,当然会报错,你下面说的不太理解,我查查看

    慕尼黑298...

    刚刚也在书上看到了,如果试图把一个父类实例转换成子类类型,则这个对象必须实际上是子类实例才行,否则运行时会有异常。 所以如果animal实际指向的是dog,那它就能强制转换为Dog 如果animal指向的是Animal,那它强制转换成Dog之后,运行的时候会出错 即,以下转换是可以的: Animal animal = new Dog();//animal实际指向Dog Dog dog = (Dog)animal; 而以下转换是不行的: Animal animal = new Animal();//animal实际指向Animal Dog dog = (Dog)animal;

    2016-08-09 23:23:20

    共 2 条回复 >

  • 慕瓜7080925
    2016-07-24 08:43:33

    public class Demo{

    public static void main(String[] args) {

    Animal a=new Animal();

    a=new Cat();

    if(a instanceof Cat){

    Cat c=(Cat)a;

    c.test();

    }else {System.out.println("无法进行强制转换");

    }

    }

    }

    class Animal {

    public void test(){

    System.out.println("转换成功");

    }

    }

    class Cat extends Animal {

    }


  • 元素滴3579866
    2016-07-23 23:12:50

    我试了你说的父类引用指向子类的对象,结果转换成功,下面是我的代码

    package com.测试;

    public class Test {

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    Animal a=new Cat();

    if(a instanceof Cat){

    Cat c=(Cat)a;

    c.test();

    }else System.out.println("无法进行强制转换");

    }


    class Animal {

    public void test(){

    System.out.println("转换成功");

    }


    class Cat extends Animal {

    }

    }





  • 元素滴3579866
    2016-07-23 23:06:44

    抱歉,我好像说错了,

  • 慕尼黑2980719
    2016-07-18 11:19:13

    好吧,也百度到了一些东西

    Java中父类强制转换成子类的原则:父类型的引用指向的是哪个子类的实例,就能转换成哪个子类的引用。

    希望大家能一起讨论

Java入门第二季 升级版

课程升级!以终为始告别枯燥,在开发和重构中体会Java面向对象编程的奥妙

530803 学习 · 6091 问题

查看课程

相似问题