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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 学习代码 中级黑马   /  2014-3-21 18:30  /  1654 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

谁能帮我,具体说一下啊,子父类在,向上向下转型,为什么要做这个之间的转换,和转换过后的用处,谁能帮忙具体说一下,有代码的更好 谢谢

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

6 个回复

正序浏览
顶一下!
回复 使用道具 举报
楼主你好,利用向上转型,可以将代码做的更通用,例如,可以将父类作为函数的形参,而将子类作为实参传递给函数,而且,接口也是利用了向上转型的思想,如:
public
  1. public class Demo{
  2. public static void main(String[] args){
  3. sub1 Obj1=new sub1();
  4. sub2 Obj2=new sub2();
  5. fun(Obj1);
  6. fun(Obj2);
  7. }}

  8. public static void fun(supper Obj){
  9. Obj.run();

  10. }
  11. class sub1 extend supper{
  12. void run(){
  13. System.out.println("sub1");
  14. }

  15. }
  16. class sub1 extend supper{
  17. void run(){
  18. System.out.println("sub2");
  19. }

  20. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

回复 使用道具 举报
向上转型:
package com.wensefu.others;
public class Animal {
       
        public void eat(){
                System.out.println("animal eatting...");
        }
}
class Bird extends Animal{
       
        public void eat(){
                System.out.println("bird eatting...");
        }
       
        public void fly(){
               
                System.out.println("bird flying...");
        }
}
class Main{
       
        public static void main(String[] args) {
               
                Animal b=new Bird(); //向上转型
                b.eat();
                //! error: b.fly(); b虽指向子类对象,但此时丢失fly()方法
                dosleep(new Male());
                dosleep(new Female());
        }
       
        public static void dosleep(Human h) {
                h.sleep();
        }
}
注意这里的向上转型:
        Animal b=new Bird(); //向上转型
        b.eat();

此处将调用子类的eat()方法。原因:b实际指向的是Bird子类,故调用时会调用子类本身的方法。

需要注意的是向上转型时b会遗失除与父类对象共有的其他方法。如本例中的fly方法不再为b所有。

2,向上转型的好处。

看上面的代码,

    public static void dosleep(Human h) {
        h.sleep();
    }

这里以父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。不然的话,
如果dosleep以子类对象为参数,则有多少个子类就需要写多少个函数。这也体现了JAVA的抽象编程思想。

二、向下转型。

与向上转型相反,即是把父类对象转为子类对象。

看下面代码:



Girl g1=new MMGirl(); //向上转型
        g1.smile();
       MMGirl mmg=(MMGirl)g1; //向下转型,编译和运行皆不会出错

这里的向下转型是安全的。因为g1指向的是子类对象。


Girl g2=new Girl();
MMGirl mmg1=(MMGirl)g2; //不安全的向下转型,编译无错但会运行会出错

评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

回复 使用道具 举报
pifuhanshu 发表于 2014-3-21 18:39
Animal b=new Bird(); //向上转型
          b.eat();
         此处将调用子类的eat()方法。原 ...

谢谢 朋友   写的可以看得懂了   
回复 使用道具 举报
class fu{
method1(){}
}
class zi extends fu{
method2(){}
}
fu f = new zi();
f.method1();//子类的对象调用父类的方法,会自动向上转型
zi z = (zi)  f;
z.method2;//子类调用子类特有的方法,需要强制向下转型。

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
本帖最后由 pifuhanshu 于 2014-3-21 19:04 编辑

          Animal b=new Bird(); //向上转型
          b.eat();
         此处将调用子类的eat()方法。原因:b实际指向的是Bird子类,故调用时会调用子类本身的方法。
需要注意的是向上转型时b会遗失除与父类对象共有的其他方法。如本例中的fly方法不再为b所有。
       向上转型的好处
看下面的代码,
    public static void dosleep(Animal b) {
        b.sleep();
    }
        这里以父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。不然的话,
如果dosleep以子类对象为参数,则有多少个子类就需要写多少个函数。这也体现了JAVA的抽象编程思想。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

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