Animal animal = dog 执行后 animal 是基于哪个类型的?为什么 Cat cat = (Cat) animal; 执行后回事false呢?

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

小光头

2017-06-13 13:32

package com.myjava2.polymorphic;

public class Initial {

	public static void main(String[] args) {
	      
        Dog dog = new Dog();//dog是Dog类型的实例
       
        Animal animal = dog;//向下类型转换
        if(animal instanceof Dog){
        Dog  dog2 = (Dog)animal;//强制类型转换
        }else{
        	System.out.println("无法进行类型转换");
        }
        if(animal instanceof Cat){
        Cat cat = (Cat) animal;//1.编译是Cat类型 2.运行是Dog类型
        }else{        
        	System.out.println("无法进行类型转换");
        }
	}

}

求解答

写回答 关注

5回答

  • Brander_PY
    2017-06-13 14:56:33
    已采纳

    这是面向对象中多态的特性,

    Animal 动物 = 狗,此时(动物)的类型属于Animal,值为狗,这是多态中类型的向下转换,是成立的
    Cat 猫 = (Cat)动物,此时(猫)的类型属于Cat,值为动物(且该动物已被赋为了狗)
    
    你可以说动物中包含狗,动物是狗的分类
    你不可以说猫中包含狗,猫是狗的分类,这样说会不会很怪,因它不成立,所以会返回false


    小光头

    非常感谢!

    2017-06-13 21:13:37

    共 1 条回复 >

  • 慕婉清0689395
    2017-06-13 14:52:25

    因为虽然我们对dog向上类型转换成了Animal,但是它是属于Dog类的,所以我们对animal进行判断时,它属于Dog类而不是Cat类(即第一个会进行强转,第二个会输出:"无法进行类型转换")。通俗的说我们可以把所有的动物放在animal类里面;但不会因为我们放在animal类里面而改变其种类。

  • 幕布斯021986
    2017-06-13 14:38:08

    先声明了一个Dog类的dog对象,然后申明Animal类的animal对象转换为Dog类中的dog对象,二cat为Cat类的对象,Cat是Animal的子类,如果向上转化类型将cat转换为animal时,因为之前animal为dog转换而来的所以animal现在是Dog类,所以会发生错误。(我是这样理解的,不知道正确不,不知道帮到你没有)

  • 幕布斯021986
    2017-06-13 14:37:47

    先声明了一个Dog类的dog对象,然后申明Animal类的animal对象转换为Dog类中的dog对象,二cat为Cat类的对象,Cat是Animal的子类,如果向上转化类型将cat转换为animal时,因为之前animal为dog转换而来的所以animal现在是Dog类,所以会发生错误。(我是这样理解的,不知道正确不,不知道帮到你没有)

  • 疯子12
    2017-06-13 14:31:18

    因为这个时候的animal指的是dog  不能再指cat了

Java入门第二季 升级版

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

530641 学习 · 6091 问题

查看课程

相似问题