上转型对象与下转型对象
程序员文章站
2023-12-25 22:29:09
...
二类特殊的对象: 上转型对象与下转型对象.
这两类对象都是在继承层面来说的.
1. 上转型对象
上转型对象是将子类的对象赋值给父类的引用,形如: SuperClass sup = subClass;
上转型对象不能使用子类新增成员(包括成员变量,成员方法),只能使用子类重写父类的方法,被子类隐藏的父类变量;子类未重写的父类方法,未被隐藏的父类成员变量.
silentlakeside 写道
属性,私有方法、静态方法、final方法都是静态绑定的,即编译期确定的。
其他方法是动态绑定的,即虚拟机运行时确定。
后者才可能出现override的情况。
其他方法是动态绑定的,即虚拟机运行时确定。
后者才可能出现override的情况。
2. 下转型对象
下转型对象是将父类的对象赋值给子类的引用,形如: SubClass sub = (SubClass)supClass;
一般认为子类父类的对象不能赋值给子类的引用,如: SubClass sub = (SubClass)new SuperClass();
这样的写法编译期不会报错,但是会产生运行时类型转换错误:
Exception in thread "main" java.lang.ClassCastException: SuperClass cannot be cast to SubClass
at Client.main(Client.java:49)
但是有一种特殊情况下,这种转换是可行的.
特殊情况: 当父类引用指向子类的对象的时候,即supClass是一个上转型对象,supClass可以通过强制转换的方式赋值给子类的引用.
举例:
/*
@author jarg
@TODO 下转型对象测试
*/
class SuperClass
{
void display()
{
System.out.println("super:\t" + this.toString());
}
}
class SubClass extends SuperClass
{
void display()
{
System.out.println("sub:\t" + this.toString());
}
}
public class Super2Sub
{
public static void main(String[] args)
{
SuperClass sup = new SubClass(); // 构造上转型对象
SubClass sub = (SubClass)sup; // 构造下转型对象
sub.display();
}
}
结果输出: sub: [email protected]
当将上转型对象赋值给子类引用的时候,这种情况可行.