java对象转型分析

一:基本介绍:

  转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。

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

  向下转型:父类引用的对象转换为子类类型称为向下转型。

二:情况分析:

  实例如下:    

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();
            // 情况二:
            // b.fly(); //此处提示在Animal中没有定义fly方法。
            //情况三:向下转型
            Bird animal1 = (Bird) b;
            animal1.fly();
            // 情况四://不安全的向下转型,编译无错但会运行会出错  
            Animal bird = new Animal();
            Bird animal = (Bird) bird;
            animal.fly();  
        //情况五:
         if(bird instanceof Bird){  
          Bird mmg1=(Bird)g2;   
          mmg1.fly (); 
        }    
  }
}

   情况一:

    向上转型Animal b引用指向new Bird ();子类对象当成父类对象,只能调用父类的成员,如果子类重写了父类的方法就根据这个引用指向调用子类重写的这个方法(这个方法就是覆盖override)。这个调用过程就称为“动态绑定”。

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

   情况二:

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

    ,所以b.fly();会报错!

   情况三:

     想象转型,即是把父类对象转为子类对象。animal1指向的是Bird子类对象。要强制转型

   情况四:

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

三:总结说明:

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

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

   如Animal father = new Bird();

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

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

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

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

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

发表评论