上转型对象的特征:
(1)上转型队形不能操作子类新增的成员字段和成员方法。
(2)上转型对象能使用父类被继承或重写的成员方法,被继承或隐藏的成员变量。
(3)如果子类重写了父类的方法,则上转型对象掉用该方法时一定是重写后的方法(多态性)。
(4)如果子类重新定义了父类的同名字段,则上转型对象访问该字段时必定是父类本身的字段,而不是子类定义的字段。
如下的例子:
//测试子类对象的上转型对象以及还原后的子类对象
class Human4{
private String name;
public static final String typeName="人类";
public Human4(String name){
this.name=name;
}
protected String getName(){
return name;
}
public void think(){
System.out.println(name+"在思考..");
}
public String like(){
return"爱好因人而异";
}
}
class Pupil4 extends Human4{
private String stuNo;
public static final String typeName="学生类";
public Pupil4(String stuNo,String name){
super(name);
this.stuNo=stuNo;
}
public String like(){
return stuNo+"号"+getName()+"爱好文娱体育运动";
}
public void learn(){
System.out.println(stuNo+"号"+getName()+"扎起学习中...");
}
}
public class Cfb{
public static void main(String[] args){
System.out.println("===学生的上转型对象====");
Human4 human=new Pupil4("001","黎明");
System.out.println("该对象的属于:"+human.typeName);
System.out.println(human.like());
human.think();
System.out.println("
===上转型对象还原为学生对象===");
Pupil4 pupil=(Pupil4)human;
System.out.println("该对象属于"+pupil.typeName);
System.out.println(pupil.like());
pupil.think();
pupil.learn();
}
}
运行结果:
===学生的上转型对象====
该对象的属于:人类
001号黎明爱好文娱体育运动
黎明在思考..
===上转型对象还原为学生对象===
该对象属于学生类
001号黎明爱好文娱体育运动
黎明在思考..
001号黎明扎起学习中...