向下转型的问题?非常之不理解?

向下转型的问题?非常之不理解?

向下转型的意思是 子类的引用指向父类的实例

那么代码是不是应该这样写 Cat temp=(Cat) new Animal();

可是老师的教程中并不是这样的 而是写成 

Animal two=new Cat();

Cat temp=(Cat) two;

那么问题又来了 如果像老师说讲的Cat temp=(Cat) two;

那么我是不是也可以这样理解把代码写成 Cat temp=(Cat) new Cat();

那么问题又来了 如果我上面写的代码成立 那么我是不是可以理解这个就是创建一个Cat对象而已

 Cat temp= new Cat();

既然是创建一个Cat对象,那么又何必把代码写成强转的呢Cat temp=(Cat) new Cat();

真的理解不了,我觉得这个地方还是没有讲透彻


正在回答 回答被采纳积分+1

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

4回答
吾慕课与归 2017-12-19 23:04:48

哎?回复怎么不能按我的格式来,都乱了。我用这个留言。请老师帮忙看下

@幸运的小叶子 老师


按我的理解:

设:父类为A,内容为:name和eat()

子类为:

B,内容为 name和age和eat()新1

C,内容为 name和weight和eat()新2

其实向下转型就是将B先向上转型为A然后再转型回B,就还是B没变。(这个理解对吗,子类转一圈就还是它自己

然后

当我们想知道B和C分别叫什么名字(name),以及怎么吃东西(eat())的时候,而没必要知道他们的年龄(age)和体重(weight)的时候就:

A a1 = new B( );

A a2 = new C( );

a1.name; a1.eat( )

a2.name; a2.eat( )

这样我觉得空间占用会很小多。

当我们需要知道他们特有的年龄(age)和体重(weight)时候,再向下转型,

B b = (B)a1;

C c = (C)a2;

b.age; 

c.weight;

这样更节省空间?

我理解的对吗?


  • 理解稍有偏差,向上向下转型的产生并不是为了节省空间,而是为了代码的扩展性,并且也没有节省空间。可以参看2017-09-04 19:01:33的回复。
    2017-12-20 10:44:08
慕丝4525420 2017-09-21 17:02:37

为什么没有针对“向下转型的意思是 子类的引用指向父类的实例那么代码是不是应该这样写 Cat temp=(Cat) new Animal();”这句话的回答呢?这才是这个问题的主要想问的吧?

慕运维2858188 2017-09-06 12:57:25

是没有讲透彻

首先   new Cat() 和 new Animal() 是两个完全不同的概念   一个是 Cat类的实例  一个是 Animal类的实例

然后  Animal two=new Cat();   的前提是 Cat 类必须继承自 Animal 类 也就是说一个是子类 一个是父类  两者必须有继承关系

最后  转型的目的是或者说继承的目的是为了多态 , 前面的转来转去只是为了演示这个转化的过程而已,所以没有实际的意义

然而  向上转型用的是最多的,

Animal cat = new Cat()  Animal person = new Person() , 在调用 cat.eat()  和 person.eat() 虽然两者都是Animal 但是却能得到子类里面不同的实现方法  

"俗称:编译看左边,运行看右边" 也就是编译的时候都是动物 ,运行的时候,人吃饭 狗吃的是屎




好帮手慕雪 2017-09-04 19:01:33

例如有个方法,需要你传入一个对象,那么在定义处一般写test(Animal animal) 而在调用的一般:Animal two=new Cat();test(two),这样的话test()这个方法它很灵活,没有规定死它,万一有一天,又增加了一个动物,test()方法依然可用。只有当需要调用某个动物的独特方法时,才需要Cat temp=(Cat) two。祝:学习愉快

  • 你好!如果像老师说的只有当需要调用某个动物的独特方法时,才需要Cat temp=(Cat) two;那么为什么不直接写成Cat temp=new Cat();,写成这个样子不是也可以吗?老师的写法跟这个有什么区别吗?能举例说明吗?
    2017-09-04 19:57:58
  • 那可能别的地方调用是Animal two=new Dog();test(two),传的是狗呢,这种形式呢你全部都强制转成Cat不就出错了嘛。只有当需要调用某个动物的独特方法时,才需要Cat temp=(Cat) two。不过也得判断一下这个two是不是Cat.if(two instanceof Cat)
    2017-09-05 18:19:35
  • 按我的理解: 设:父类为A,内容为:name和eat() 子类为: B,内容为 name和age和eat()新1 C,内容为 name和weight和eat()新2 其实向下转型就是将B先向上转型为A然后再转型回B,就还是B没变。(这里你理解的是对的,子类转一圈就还是它自己) 但是情况就来了。 当我们想知道B和C分别叫什么名字(name),以及怎么吃东西(eat())的时候,而没必要知道他们的年龄(age)和体重(weight)的时候就: A a1 = new B( ); A a2 = new C( ); a1.name; a1.eat( ) a2.name; a2.eat( ) 这样我觉得空间占用会很小多。 当我们需要知道他们特有的年龄(age)和体重(weight)时候,再向下转型, B b = (B)a1; C c = (C)a2; b.age; c.weight; 这样更节省空间? 我理解的对吗?
    2017-12-19 23:03:07
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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