关于类型转换后的疑问

关于类型转换后的疑问

  1. 1.Animal a = new Cat();来说,Cat c = new Cat();既然a不能使用Cat()内的非父类相关的方法,这么说就相当于是一个不完整的Cat类对象,那还不如直接定义一个Cat a = new Cat();这样就好了,这么定义的好处在哪呢?

  2. 2.Cat c2 = (Cat)a;父类和子类的引用(对象就是引用么)都在栈里面么?他们有什么关系?向上或向下转型后,是父类和子类的引用共同指向了原来堆内的内存么?

  3. 3.对象只是存储堆内的地址,为什么转型对象会改变指向内存空间的内容呢(就是具有子类特征的父类对象)?


    对多态理解比较混乱,语言组织不太好,望详细解答一下,谢谢

正在回答

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

1回答

1、对于这个问题,多态的应用是有它的场景的。比如:一个类有多个子类,而有一个方法需要对这些子类中的需要从父类继承来的方法进行调用,那么这个方法的参数就可以是父类的引用。然后调用方法时传入子类的对象即可。这就是多态的一种体现。

Animal a=new Cat()是在需要多态的场景下适应的,就像上面说的场景,所以不能说它是一个不完整的Cat类对象。

2、对象不是引用,比如Cat cat;在这里cat是引用。Cat cat=new Cat(); 在这里new Cat()是创建了一个对象。引用指向对象,可以理解为cat引用代表对象,通过cat可以去访问对象。引用是存储在栈中的,而对象是存储在堆中的。

向上和向下转型后,父类和子类的引用是共同指向了该对象。

3、地址表示的是内存的一块存储空间,数据就存储在这块空间里,只不过输出对象得到的是内存地址而已,但只要重写toString()方法,再输出对象时就可以输出存储的内容了。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 莨菽菽 提问者 #1
    恩,理解了,就是多态有他自己的运用场景,不可能什么场景都符合 不过还有点疑问:1.(转型后)父类,子类的引用共同指向同一个对象,为什么子类的引用可以调用所以子类的方法,但是父类引用却只能调用父类相关的方法呢(就是重写的和父类继承过来的)?不是指向同一块内存么?应该存储的内容是一样的啊?
    2017-05-11 11:38:23
  • 好帮手慕珊 回复 提问者 莨菽菽 #2
    父类毕竟跟子类是不一样的,他们具有的特性也不一样,为了避免父类去访问子类的特有内容,所以Java中进行了限制。
    2017-05-12 18:43:32
  • 莨菽菽 提问者 #3
    感谢耐心回答我的追问,那么久没人回答我,我还以为我太钻牛角尖就被忽视了呢,非常感谢
    2017-05-12 18:48:08
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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