class Test{ public static void main(String[] args) { Person p = new Student(); //向上转型,Student对象转为Person对象 A a = new A(); a.see(p); } } class Person{ // public void like(){ // } } class Student extends Person{ public void like(){ System.out.println("学生爱摸鱼"); } } class Teacher extends Person{ public void like(){ System.out.println("老师爱上课"); } } class A{ public void see(Person person){ if (person instanceof Student){ //instanceof 关键字,判断对象所属的父类型 Student s = (Student)person; //向下转型,将Person类对象转为Student对象,以下teacher类同理 s.like(); } if (person instanceof Teacher){ Teacher t = (Teacher) person; t.like(); } } }
运行结果:
学生爱摸鱼
为什么要进行向下转型?
因为通过 Person p = new Student(); 这种方式创建对象的话,执行方法时,虚拟机会先查看=左边的类是否有该方法,如果没有就报错。编译无法通过。 无法直接调用子类独有的方法,只能通过向下转型,转为子类对象才能调用。
注意!
向下转型之后必须用一个新的子类对象接收。