• Tags , , , ,         
  • 2017-12-21  20:44:28        
  • 141 °C    

    向上转型和向下转型的概念:


    我们已经学了继承这个概念,那么,向上转型和向下转型讲的就是父类和子类之间的关系:

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

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

    通俗点来说,就是父类类型和子类类型的互相转换,但是子类是继承了父类的所有成员,而父类少了子类的一些成员(新建的一些成员),所以在向上转型的时候还要注意到这一点。

    实例操作:


    向上转型可能会发生的错误是父类用了子类里面有,而父类里面没有的方法

    //Break易站实例:
    public class Animal {
    public void eat(){
    System.out.println("animal is eatting...");
    }
    }
    class Fish extends Animal{
    public void eat(){
    System.out.println("Fish is eatting...");
    }
    public void swim(){
    System.out.println("Fish is swimming...");
    }
    }
    class Main{
    public static void main(String[] args) {
    Animal f=new Fish(); //向上转型
    f.eat();
    f.swim(); //此处提示在Animal中没有定义swim方法,所以运行会出错
    }

    向下转型的话,如果父类引用的对象是父类本身,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。

    //Break易站实例:
    public class Animal {
    public void eat(){
    System.out.println("animal is eatting...");
    }
    }
    class Fish extends Animal{
    @Overwrite
    public void eat(){
    System.out.println("Fish is eatting...");
    }
    public void swim(){
    System.out.println("Fish is swimming...");
    }
    }
    class main{
    public static void main(String[] args) {
    Animal f=new Fish(); //向上转型
    f.eat();
    Fish f2=(Fish)f; //向下转型,编译和运行皆不会出错
    f2.eat();
    f2.swim();
    Animal a = new Animal();
    //Fish f3=(Fish)a; //这个向下转型,运行会出错的
    //f3.eat();
    //f3.swim();
    if(f3 instanceof Fish){
    Fish f3=(Fish)a; //这个向下转型,运行不会出错
    f3.eat();
    f3.swim();
    }
    }

    总结:


    1. 向上转型时,子类中新定义的成员方法会丢失。就像Animal访问不到swim的方法一样

    2. 子类引用不能指向父类对象。Fish c = (Fish)new Animal()这样是不行的。但是父类引用可以指向子类对象

    3. 向上转型的好处是减少重复代码,使代码变得简洁和提高系统扩展性,符合Java的面向对象的过程。

    4. 向下转型的前提是父类对象指向的是子类对象(也就是说,在向下转型之前,它得先向上转型)或者用instanceof,这样才会正确

    5. 向下转型只能转型为本类对象(鱼是不能变成鸟的)。

    本文内容来自:Java的向上转型和向下转型 – Break易站


    —Author: Arvin Chen —Web Address: www.breakyizhan.com (Break易站)

     
    转载请保留页面地址:https://www.breakyizhan.com/javamind/994.html