A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘佳 中级黑马   /  2012-8-9 16:28  /  1231 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘佳 于 2012-8-9 20:32 编辑

为什么要向上向下的转型,直接父类用父类,子类用子类不行吗?

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
本帖最后由 张雪磊 于 2012-8-9 17:23 编辑

直接父类用父类,子类用子类不行吗?

答:

那类与类之间就没有关系了,当子类中想用到父类中的成员时就只能再写一遍了,比如你要描述10个动物,那每个类就要写一个吃饭的方法,如果把这个吃饭的方法抽取出来形成一个父类,那即是你写10000000000个动物,只要继承了父类,都不需要重新写这个吃饭地方法了,只要调用父类的方法就行了。这个就是继承后的好处了,继承还有个好处有了它就有了多态的实现。

class Animal
{      void eat(){
        }
}
一只猫继承了Animal这个类,那这只猫就能吃东西了


为什么要向上向下的转型 ?

答:

对于多态假设这代码是这样的

假如在其他类的方法中需要这只猫有游泳的方法,
那可以这么做
public void toSwim(猫 c){
//你可以直接让猫实现游泳的方法
猫 c = c;
   c.swim();
}

但你能让也狗实现这个方法吗?行,但是要跟操作猫一样再写一遍。如入再有千千万万个动物需要实现这个功能岂不是要写很多遍,而且实际上可不只是游泳那么简单的方法

但如果你用多台的方法,
public void toSwim(Animal c){//这里只要是Animal的子类都可以往里传,所以要先继承嘛,他先当予Animal c = new 你想传的动物()
                                             //这样只要是继承了Animal的类都可以用这个方法,本来需要些很多方法的事现在之要写一个了。当然
                                             //Animal c = new  你想传的动物() 这句话已经把你想传的动物向上提升成Animal类了,你只能用Animal
                                             //类的方法,如果你想用子类地方法就要先下转型。


/*
总结下类
1,多态的体现
        父类的引用指向了自己的子类对象。
        父类的引用也可以接收自己的子类对象。
2,多态的前提
        必须是类与类之间有关系。要么继承,要么实现。
        通常还有一个前提:存在覆盖。


3,多态的好处
        多态的出现大大的提高程序的扩展性。


4,多态的弊端:
        虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。


*/

   c.swim();
}


评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 很给力!

查看全部评分

回复 使用道具 举报
在做类型转换的时候,子类不能把父类转换成自己的类型。
比如:父类里的方法,子类里肯定都有,除非父类里是private修饰,子类定义的某些属性肯定大于等于父类里
所以,子类的对象不一定是父类的对象,而父类的对象肯定是子类的对象。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 新人亮相,赞一个!

查看全部评分

回复 使用道具 举报
  我们在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型。
  在现实中常常这样说:这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念“人”。再例如,麻雀是鸟类的一种(鸟类的子类),而鸟类则是动物中的一种(动物的子类)。我们现实中也经常这样说:麻雀是鸟。这两种说法实际上就是所谓的向上转型,通俗地说就是子类转型成父类。这也符合Java提倡的面向抽象编程思想。向上转型体现了类的多态性,增强了程序的简洁性。

子类转型成父类是向上转型,反过来说,父类转型成子类就是向下转型。但是,向下转型可能会带来一些问题:我们可以说麻雀是鸟,但不能说鸟就是麻雀。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
子类当父类用的,父类变量可以接收其子类对象,而不仅仅局限于自己的对象。父类有的子类也有,比直接用父类更强大。
向上转型主要是为了让子类当父类用。子类用子类是可以。

通常一个父类有多个子类,而这些子类拥有很多相同的方法,但它们的特性有些差别,比如ArrayList和LinkedList,同时List接口的子类。ArrayList是数组结构,查找快,增删慢;LinkedList是链表结构,查找慢,增删快。在数据量不大的时候,用哪个都无所谓。当数据量上万的时候就要考虑用哪一个了,这取决于查得多还是增删得多。举个例子,在成绩查询系统中,用ArrayList较好,因为输入一次,可能被查很多次。
如果你是直接把子类当子类用,那么当你要修改ArrayList为LinkedList,得费一番功夫,维护成本大。Java这样,更简化了程序员的工作,这是Java的一贯追求。

用父类变量来引用子类对象,不论实际类型是哪个,其方法名一样,也就不用频繁更改。除非用到一些父类没有的特性时才不这样做。
而且只有父类中声明的方法,才能调用,即父类不能调用子类的特有方法。如果方法在子类中被重写,将调用子类的方法。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马