一对象的上转型对象
假设,A类是B类的父类,当我们用子类创建一个对象,并把这个对象的引用放到父类的对象中时,比如
A a=new B();
或
A a;
B b=new B();
a=b;
称这个父类对象 a,是子类对象b的上转型对象。好比说“老虎是哺乳动物”。对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原对象的一些属性和功能。上转型对象具有如下特点:
1 上转型对象不能操作子类新增的成员变量(失掉了这部分属性),不能使用子类新增的方法(失掉了一些功能)。
2 上转型对象可以操作子类继承或重写的成员变量,也可以使用子类继承的或重写的方法。
3 如果子类重写了父类的某个方法后,当对象的上转型对象调用这个方法时一定是调用了这个重写的方法,因为程序在运行时知道,这个上转型对象的实体是子类创建的,只不过损失了一些功能而已。
注:不要将父类创建的对象和子类对象的上转型对象混淆。
可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所给的所有属性和功能。
不可以将父类创建的对象的引用赋值给子类声明的对象(不能说“哺乳动物是老虎”)。
下面的例子中,m是People类型对象的上转型对象。
例子21:
class 类人猿
{
private int n=100;
void crySpeak(String s)
{
System.out.println(s);
}
}
class People extends 类人猿
{
void computer(int a,int b)
{
int c=a*b;
System.out.println(c);
}
void crySpeak(String s)
{
System.out.println("**"+s+"**");
}
}
class Example4_21
{
public static void main(String args[])
{
类人猿 m=new People(); //m是People对象的上转型对象。
m.crySpeak("I love this game");
People people=(People)m; //把上转型对象强制转化为子类的对象。
people.computer(10,10);
}
}
在上述例子中,上转型对象m调用方法:
m.crySpeak("I love this game");
得到的结果是“**I love this game**”。而不是“I love this game”。
因为m调用的是子类重写的方法crySpeak。
注:不可以
m.n=1000;
因为子类本身就没有继承n,也不可以
m.computer(10,10);
因为computer是子类新增的方法。