前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaSE(五)JAVA对象向上转型和向下转型

JavaSE(五)JAVA对象向上转型和向下转型

作者头像
用户1195962
发布2018-01-18 15:15:44
1K0
发布2018-01-18 15:15:44
举报
文章被收录于专栏:LanceToBigDataLanceToBigData

今天做了一个测试的题目,发现自己还是很多问题没有静下心来做。很多问题是可以自己解决的但是自己一是没有读清题意,二是自己心里太急躁了。所以这个要自己应以为鉴!

 对象的转型问题其实并不复杂,我们记住一句话:“父类引用指向子类对象”。

java中对象的转型分为向上转型和向下转型

一、对象的向上转型

  1.1、定义

子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口

  1.2、解释

    比如说我有两个类,一个是父类Animal,另一个是Bird类为子类。

    Animal b = new Bird();

    这就是upcasting,向上转型。这时b就是执行以恶搞Bird对象。

  1.3、实例

代码语言:javascript
复制
package com.zyh.test;

public class Animal {
    public void eat(){
        System.out.println("animal eating....");
    }
}
class Bird extends Animal{
    public void eat(){
        System.out.println("Bird eating...");
    }
    public void fly(){
        System.out.println("Bird flying...");
    }
}
class Main{
    public static void main(String[] args){
        Animal b1 = new Bird();
        b1.eat();
//        b1.fly();  b虽然指向子类对象,但此时丢失了fly方法
        doSleep(new Male());
        doSleep(new Female());
        
    }
    public static void doSleep(Human h){
        h.sleep();
    }
}
代码语言:javascript
复制
package com.zyh.test;

public class Animal {
    public void eat(){
        System.out.println("animal eating....");
    }
}
class Bird extends Animal{
    public void eat(){
        System.out.println("Bird eating...");
    }
    public void fly(){
        System.out.println("Bird flying...");
    }
}
class Main{
    public static void main(String[] args){
        Animal b1 = new Bird();
        b1.eat();
//        b1.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方法。

向上转型时,父类指向子类引用对象会遗失除与父类对象共有的其他方法,也就是在转型过程中,子类的新有的方法都会遗失掉,在编译时,系统会提供找不到方法的错误。

  1.4、向上转型的优点 

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

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

二、对象的向下转型

  1.1、定义

    父类引用的对象转换为子类类型成为向下转型

  1.2、解释

    Son s = (Son)f1;

    这就是downcasting,向下转型。

  1.3、实例

代码语言:javascript
复制
package com.zyh.test;

public class Person {
    public void play(){
        System.out.println("Person play...");
    }
}
class Boy extends Person{
    public void play(){
        System.out.println("boy play...");
    }
    public void run(){
        System.out.println("run play...");
    }
}
class RunMain{
    public static void main(String[] args){
        Person b = new Boy();//向上转型
        b.play();
        System.out.println("-------------------------");
        Boy b1 =(Boy)b;//向下转型
        b1.play();
        b1.run();
        
    }
}

  结果:

  在这个程序中       

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

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

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

    运行出错:

    Exception in thread "main" java.lang.ClassCastException: com.wensefu.other1.Girl     at com.wensefu.other1.Main.main(Girl.java:36)

  所以向下转型过程中要注意的是:     

情况一:如果父类引用的对象如果引用的是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。

    情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。

 三、总结

1、父类引用可以指向子类对象,子类引用不能指向父类对象。

2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。

   如Father father = new Son();

3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。

   如father就是一个指向子类对象的父类引用,把father赋给子类引用son 即Son son =(Son)father;

   其中father前面的(Son)必须添加,进行强制转换。

4、upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效

5、向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-08-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、对象的向上转型
  • 二、对象的向下转型
  •  三、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档