疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java向上转型和向下转型


 

   

  首先定义父类Animal,所有动物都有一个吃东西的方法;子类Dog还增加了一个叫的功能。

  public class Animal {

  public void eat() {

  System.out.println("eat like an animal");

  }

  }

  public class Dog extends Animal {

  @Override

  public void eat() {

  System.out.println("eat like an dog");

  }

  public void barking() {

  System.out.println("dog like barking");

  }

  }

  1、向上转型

  向上转型(upcasting):子类引用的对象转换为父类类型。

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

  public class Demo {

  public static void main(String[] args) {

  // upcasting

  Animal animal = new Dog();

  animal.eat();

  // animal.barking(); The method barking() is undefined for the type Animal

  }

  }

  运行结果:eat like an dog

  2、向下转型

  在向下转型过程中,分为两种情况:

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

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

  public class Demo {

  public static void main(String[] args) {

  Animal animal = new Dog();

  // 情况1

  Dog dog1 = (Dog) animal;

  dog1.eat();

  dog1.barking();

  // 情况2

  Dog dog = (Dog) new Animal();

  dog.eat();

  }

  }

  运行结果:

  eat like an dog

  dog like barking

  Exception in thread "main" java.lang.ClassCastException: demo.Animal cannot be cast to demo.Dog

  at demo.Demo.main(Demo.java:12)

  总结:

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

  2、 向上转型不用强制转型。

  3、 向下转型要强制转型。

  4、 Upcasting会丢失子类特有方法,子类重写的父类方法有效。