对象的上转型即声明一个父类类型的变量,但将子类的实例赋给了它。或叫父类变量指向了子类对象。有什么意义呢?因为子类是对父类的改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特。定义一个父类类型的引用指向一个子类的对象既可以使用子类更强大的功能,又可以抽取父类的共性。
例如:
People p1=new Student();//赋值相容,上转型,子类对象即是父类对象
Student s1=new People();//赋值不相容,编译错误,父类对象不是子类对象
1. 对于成员,如果父类有,子类没有,则子类继承;如果父类没有,子类有,则属于子类增加的;
2. 如果父类子类都有,便属于隐藏或覆盖。其中对于成员变量和静态方法,属于隐藏;对于实例方法,属于覆盖。
3. 一般的,子类对象调用子类的成员,父类对象调用父类的成员。但对于上转型的对象,则调用成员变量和静态方法时,调用的是父类的,因此叫隐藏成员变量和静态方法。
对于成员变量和静态方法,父类的成员变量和静态方法并没有被子类抹去,父类的隐藏了子类的。上转型对象引用的是父类的。
对于实例成员方法,子类的覆盖父类的。上转型对象引用的是子类的。这种方式称为动态绑定。
更多知识,详见:https://www.cnblogs.com/shakinghead/p/7445831.html
测试代码:
父类:
package test.finalpack;
public class Father {
int a = 10;
//类方法
public static void sleep(){
System.out.println("父类睡觉的方法");
}
//实例方法
public void eat(){
System.out.println("父类吃饭");
}
}
子类:
package test.finalpack;
public class Son extends Father{
int a = 20;
public static void sleep(){
System.out.println("子类睡觉");
}
public void eat(){
System.out.println("子类吃饭");
}
}
测试类:
package test.finalpack;
public class TestClass {
public static void main(String[] args) {
Father son = new Son();
System.out.println(son.a);
son.sleep();
son.eat();
}
}