class Base{
public void print() {
System.out.println("Run Base's Print()");
}
}
class Son1 extends Base{
public void print() {
System.out.println("Run Son1's Print()");
}
}
class Son2 extends Base{
public void print() {
System.out.println("Run Son2's Print()");
}
}
public class Test {
public static void main(String[] args) {
//向上转型
Base son1 = new Son1(); //我的理解是,实际上Base类型的引用指向的仍然是Son1类型的对象,所以调用其实还是子类的东西
System.out.println(son1.getClass()); //此时使用getClass类其实仍然能够得到Son1()
son1.print(); //调用的仍然是Son1的print方法
Son1 tmp = (Son1)son1; //如果son1之前确实是Son1类型,那么运行不会报错
Son2 tmp2 = (Son2)son1; //如果son1之前不是Son2类型,编译不会出错,但是运行会报错
//因此,直接向下转型具有一定的风险,所以可以使用instance of 来判断
if(son1 instanceof Son1) {
Son1 tmp3 = (Son1)son1;
}
if(son1 instanceof Son2) {
Son2 tmp4 = (Son2)son1;
}
}
}