向上转型
父类引用指向子类对象称为向上转型
其实就是把子类对象直接赋给父类引用,不用进行强制转换。
使用向上转型可以调用父类类型中的所有成员,在进行编译时会进行静态绑定,对象与指定的类型进行方法绑定
调用某个方法,究竟执行哪一段方法,要看这个引用指向的是父类还是子类对象,这个过程是在运行时决定的,因此称为 动态绑定。
向下转型
与向上转型相反,子类对象指向父类引用就是向下转型
向下转型可以是调用子类类型中的所有成员,不过需要注意的是如果父类引用对象指向的是子类对象,那么在向下转型的过程的过程中是安全的,也就是编译不会发生错误,但是如果指向的是父类对象,就会发生编译错误
我们可以使用 instanceof 判断是否是某一个类
class father{
public String name="我是父类";
static void eat(){
System.out.println("父类的静态方法");
}
void sleep(){
System.out.println("父类的成员方法");
}
}
class son extends father{
static void eat(){
System.out.println("子类的静态方法");
}
@Override
void sleep() {
System.out.println("子类的成员方法");
}
}
public class Main{
public static void main(String[] args) {
//向上转型
father f=new son();
f.eat();
f.sleep();
System.out.println(f.name);
//向下转型
son s=(son)f;
s.sleep();
s.eat();
if(s instanceof son){
System.out.println("他确实是儿子");
}else{
System.out.println("他不是儿子");
}
}
}
如上,son类继承father类
father f=new son();
f.eat();
f.sleep();
System.out.println(f.name);
父类引用对象 f 指向了一个子类对象,当 f 调用静态eat()方法时和实例方法sleep()时
调用eat(),由于静态绑定,调用father类的静态方法eat();
调用sleep(),由于f 实际指向的是一个son类对象,所以调用的是son类的sleep方法
结果如下:
son s=(son)f;
s.sleep();
s.eat();
子类对象引用s 指向了一个父类对象,但是这个父类对象其实还是一个子类对象
当调用sleep()方法和eat()方法时,
调用sleep()时,由于静态绑定,调用的就是子类son的静态方法
调用eat()时,s 指向的是son类,调用的就是子类son的实例方法
结果如下: