向上转型和向下转型
对象既可作为它本身的类型使用,也可作为它的基类型使用,通过类型转换(转型)来实现,对象的类型转换分两种,把对某个对象的引用视为对其基类型的引用的做法称为“向上转型
”,反之则称为“向下转型
”
- 向上转型对象不能操作子类新增的成员属性和方法(失掉了这部分功能)
- 向上转型对象可以操作子类继承或隐藏的成员变量,也可以使用子类继承或重写的方法
- 可以将向上转型对象再强制转换到它本来的类型(向下转型),该对象就又具备了其所有的属性和方法
- 向上转型对象操作子类继承或重写的方法时,就是通知对应的子类对象去调用这些方法
package inter;
public class SuperClass {
private int x;
public SuperClass(int x) {
this.x = x;
System.out.println("父类构造方法");
// TODO Auto-generated constructor stub
}
public void printInfo() {
System.out.println("父类方法:"+this.x);
}
public static void main(String[] args) {
// 向上转型,把创建的子类对象赋给父类的引用
SuperClass p = new ChildClass(10);
p.printInfo();
// 向上转型后,子类中存在但父类中不存在的方法无法使用
// p.display();
// 向下转型,把父类的引用强制还原为子类的引用
ChildClass p2 = (ChildClass)p;
p2.display();
// instanceof判断实例对象是否属于某个类
System.out.println(p instanceof SuperClass);
// true
System.out.println(p2 instanceof ChildClass);
// true
SuperClass p3 = new SuperClass(10);
// 父类对象p3不是子类的实例
System.out.println(p3 instanceof ChildClass);
// false
// 创建父类的对象不能转换为子类,以下用法错误
// ChildClass p4 = (ChildClass)p3;
ChildClass p4 = new ChildClass(20);
p4.display();
// 子类对象属于父类
System.out.println(p4 instanceof SuperClass);
// true
}
}
class ChildClass extends SuperClass{
private int x;
ChildClass(int x){
super(x);
this.x = x;
System.out.println("子类构造方法");
}
public void display() {
System.out.println("子类方法:"+this.x);
}
}