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. 父类向子类要用强制转换,但类型不安全.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值