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