子类转换成父类:可以。
父类转换成子类:不一定可以。
如果父类对象的引用指向的实际是一个子类的对象,那么父类对象的引用可以强制转化成子类对象的引用。如:
Parent p=new Son()
Son s=(Son)p; --正确
Parent p=new Parent()
Son s=(Son)p; --错误
因为继承的概念就是子孙类会越来越比祖先类详细,所以可以将子孙类强制转换成祖先类,因为祖先有的行为子孙类示例都有了(重新定义的或者是默认的);但是当将祖先类示例强制转换成子孙类示例的时候,一些子孙类有的行为祖先是没有的(即使的是默认的实现也没有)。
Java中父类强制转换成子类的原则:父类型的引用指向的是哪个子类的实例,就能转换成哪个子类的引用。
例:
public class Test {
public static void main(String[] args) {
Person person = new Boy();
Boy boy = (Boy) person;
boy.eat();
}
}
class Person {
public void eat() {
System.out.println("The people were eating");
}
}
class Boy extends Person {
public void eat() {
System.out.println("The boy were eating");
}
}
打印结果:The boy were eating
原因:当Boy实例化后将引用地址返回传给person,这时person引用实际指向的是Boy,所以将person转换成Boy能成功。
再定义一个类:
class Girl extends Person {
public void eat() {
System.out.println("The girl were eating");
}
}
main方法中添加:
Person p = new Girl();
Boy b = (Boy)p;
b.eat();
运行时提示:Girl cannot be cast to Boy(不能将女孩转换成男孩)
原因:当Girl实例化后将引用地址返回传给p,这时p引用实际指向的是Girl,将p转换成Boy也就是说将Girl转换成Boy,肯定不能成功。