> 文档中心 > java中的对象转换

java中的对象转换

用例子来说明:

 

package com.converttest;

 class Animal {
 Animal()
 {
  System.out.println("Animal constructor!");
 }
 public void eat()
 {
  System.out.println("Animal eat!");
 }
 
}

 

 class Bird extends Animal{
 Bird()
 {
  System.out.println("Bird constructor!");
 }
 
 public void fly()
 {
  System.out.println("Bird fly!");
 }
 public  void eat()
 {
  System.out.println("Bird eat!");
 }
}

 

class converttest {
 public static void main(String[] args){
  System.out.println("test case 1: ---------------!");
  Animal a1 = new Animal();
  Bird b1 = new Bird();
  
  a1.eat();
  b1.eat();
  
  a1 = b1;  //OK, 隐式转换,子类实例向父类转换,相当于a1 = (Animal)b1;。
  a1.eat(); //OK,调用的是子类的eat函数
  //a1.fly();           // error, fly 不是a1类型的。
  
  //b1 = a1;            //error, 父类转向子类,没用强转,所以编译错误。
  b1 = (Bird)a1;  //OK, 父类转向子类,用强转,所以编译正确。
  b1.eat();       //OK, 调用的是子类的eat函数。

 

  System.out.println("test case 2: ---------------!");
  Animal a2 =  new Bird(); //OK, 隐式转换,子类实例向父类转换,相当于Animal a2 =  (Animal)new Bird();;。
  a2.eat();
  //a2.fly();  // error,Animal无法访问子类的fly函数。

  //Bird b2 = new Animal();  //error, 父类转向子类,没用强转,所以编译错误。
  Bird b2 = (Bird)new Animal();  //OK, 父类转向子类,必须用强转。
  b2.eat(); //Exception in thread "mainException in thread "main" java." java.lang.ClassCastException:    com.interfacetest.Animal cannot be cast to com.interfacetest.Bird
            //at com.interfacetest.converttest.main(interfacetest1.java:101)
  b2.fly(); //Exception in thread "mainException"......
 }
}

 

/* result:
 test case 1: ---------------!
Animal constructor!
Animal constructor!
Bird constructor!
Animal eat!
Bird eat!
Bird eat!
Bird eat!
test case 2: ---------------!
Animal constructor!
Bird constructor!
Bird eat!
Animal constructor!
Exception in thread "main" java.lang.ClassCastException: com.interfacetest.Animal cannot be cast to com.interfacetest.Bird
 at com.interfacetest.converttest.main(interfacetest1.java:101)
*/

 

说明: 1. 子类向父类会自动进行隐式转换,是类型安全的;

           2. 父类向子类要用强制转换,但类型不安全.