父类对象强转子类对象

父类对象强转子类对象

老师,您好!如图,为什么equals重写中Object对象强转Animal对象不会出现报ClassCastException异常?但我同样在主方法里也实例化Object对象强转Animal对象就会报异常,按道理说父类对象是不可以强转子类对象,除非定义成  Object obj2 = new Animal()  才可以正常编译。这个问题已经困惑我好些天了,一直未能解决,烦请老师帮忙解惑!

https://img1.sycdn.imooc.com//climg/630c25d5097f95d308140426.jpg

https://img1.sycdn.imooc.com//climg/630c262c091f74d408160577.jpg

https://img1.sycdn.imooc.com//climg/630c26ac09ff95e108180393.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好

1、调用Animal类中的equals方法时,若传入的参数实例对象类型为Animal或其子类,则程序可以正常运行;但若传入的参数类型为非Animal或其子类型时,则运行后出现类转换异常ClassCastException。

注:

https://img1.sycdn.imooc.com//climg/630c36a009deeb1805060125.jpg

2、主方法里引用obj1为Object类型(Object obj1;),其引用的对象类型也是Object(new Object();),故obj1无法转换其他类型,转换时会报ClassCastException异常。

3、Object obj2 = new Animal(),引用obj2类型为Object,引用的实例对象类型为Animal,故obj2可以强转为Animal类型。

4、Dog是Animal类型的子类,故可以直接赋值给animal,无需强转。

Dog d = new Dog();
Animal animal = d; // 向上转型

//相当于
Animal animal2 = new Dog();


注:建议同学此时不要纠结于此处哦,继续向后学习多态章节相关知识,学习后若仍无法理解,可继续在问答区发起提问哦。

多态章节:https://class.imooc.com/course/2064 

祝学习愉快~

  • hor5 提问者 #1

    老师,我已经很纠结了,你说的我也都知道,但是在Animal类equals方法重写传入的参数是Object obj,obj是Object的对象,obj不可能是Animal或其子类,反而Object是Animal的父类,我一直没理解的地方是这个点。

    https://img1.sycdn.imooc.com//climg/630c3c6e09ae380f08450417.jpg

    2022-08-29 12:11:28
  • hor5 提问者 #2

    我突然有些清醒,是不是重写equals方法传入的obj对象   相当于  Object obj = new Animal(),因为是在Animal类重写的equals方法,并不是在Object类中的的equals方法传入的obj对象。如果在Object类中equals方法传入的obj对象   相当于  Object obj = new Object()。

    2022-08-29 12:16:54
  • 好帮手慕小小 回复 提问者 hor5 #3

    同学你好,不是的,与传入的对象类型有关,与方法在哪个类无关。例如:

    public boolean equals(Object obj) 方法参数obj类型为Object,即表示方法可以接收任意类型的参数。例如:

    Animal a1 = new Animal();
    a1.equals(new String()); //传递进方法的参数:相当于Object obj = new String();
    
    Object obj = new Object();
    obj.equals(new String());
    祝学习愉快~
    2022-08-29 13:37:32
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师