为了账号安全,请及时绑定邮箱和手机立即绑定

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

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("无法进行类型转换");
        }
	}

}

求解答

正在回答

6 回答

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

Animal 动物 = 狗,此时(动物)的类型属于Animal,值为狗,这是多态中类型的向下转换,是成立的
Cat 猫 = (Cat)动物,此时(猫)的类型属于Cat,值为动物(且该动物已被赋为了狗)

你可以说动物中包含狗,动物是狗的分类
你不可以说猫中包含狗,猫是狗的分类,这样说会不会很怪,因它不成立,所以会返回false


3 回复 有任何疑惑可以回复我~
#1

小光头 提问者

非常感谢!
2017-06-13 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信