java对象转型

java对象转型 向上转型和向下转型

  • 什么是对象转型?
    对象转型是在继承的基础上而言的,对象类型转换主要包含向上转型和向下转型。继承是java面向对象的基本特征之一,是代码复用的一种机制,通过继承子类可以复用父类的方法等;如果父类的方法不满足子类的需求,子类可以通过重写父类的方法或者新增属于自己特性的方法对自身的功能加以扩展。

    • 1向上转型:
      子类引用的对象转换为父类类型称为向上转型。子类的对象转为父类对象,此处父类对象可以是接口。
      {eg:Annimal dog =new Dog();}
    • 2向下转型:
      父类引用的对象转换为子类类型称为向下转型。
      {eg:Dog dog =new Animal();//不安全的向下转型
      上述编译通过,但是运行时候报错,类型转换错误!
      正确操作:
      Annimal ad =new Dog();
      Dog dog = (Dog)ad;
      }
  • 向上转型注意:

    • 前者是一个向上转型,Animal dog 引用指向new Dog();子类对象当成父类对象,只能调用父类的成员,如果子类重写了父类的方法就根据这个引用指向调用子类重写的这个方法(这个方法就是覆盖override)。这个调用过程就称为“动态绑定”。(即子类重写父类方法,向上转型对象调用该方法,方法指向子类中重写的方法)
    • 向上转型时,父类指向子类引用对象会遗失除与父类对象共有的其他方法,也就是在转型过程中,子类的新有的方法都会遗失掉,在编译时,系统会提供找不到方法的错误。如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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方法。
  • 向下转型注意:
    情况一:如果父类引用的对象如果引用的是指向的子类对象(即先向上转型),那么在向下转型的过程中是安全的。也就是编译是不会出错误的。此时对象可以调用子类所有的成员。
    情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。
1
2
3
4
5
6
7
8
9
10
11
12
13
class Main{
public static void main(String[] args) {
Animal b=new Bird(); //先向上转型(父类引用对象指向子类对象)
Bird bird = (Bird) b;//向下转型,编译和运行都不报错
Animal a=new Animal(); //(父类引用对象指向父类本身对象)
Bird bird = (Bird) a;//不安全的向下转型,编译正常,运行报错(类型转换错误)
//解决方法 instance of
if(a instanceof Bird){
Bird bird=(Bird) a;
bird.eat();
bird.fly();
}
  • 总结:
    1、父类引用可以指向子类对象,子类引用不能指向父类对象。
    2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。
    3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。
    4、upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效 。
    5、向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。

参考:夜雨阑珊