1.向上转型
向上转型是指父类引用子类对象,就是子类对象能转换成父类对象。
假设有父类Person类对象p和子类Student对象s,则
Person p; p=new Student(); //父类Person对象p引用子类Student新创建的对象 Student s=new Student(); p=s; //父类Person对象p引用子类Student对象s 也可以直接写成: Person p=new Student();//父类Person对象p引用子类Student新创建的对象
当子类对象s赋给父类对象p时,是隐式转换,不用进行强制类型转换。对于上述例子,父类引用子类对象后只能引用父类中的成员变量和方法,而不能访问子类自己定义的成员变量和成员方法。
所以综上所述向上转型的特点如下:
(1)向上转型对象不能操作子类新增的成员变量(失掉了这部分属性),不能使用子类新增的方法(失掉了一些功能)。
(2)向上转型对象可以操作子类继承或重写的成员变量,也可以使用子类继承的或重写的方法。
(3)如果子类重写了父类的某个方法后,当对象的向上转型对象调用这个方法时一定是调用了这个重写的方法,因为程序在运行时知道,这个向上转型对象的实体是子类创建的,只不过损失了一些功能而已。
(4)对象的向上转型对象再强制转换到该子类的一个对象,这时又具备了子类所有的属性和功能。
2.向下转型
向下转型是指子类引用父类对象,就是将父类对象能转换成子类对象,这时需要满足两个条件:一是必须执行强制类型转换;二是必须确保父类对象是子类的一个实例,否则抛出异常。
假设有父类Person类对象p和子类Student对象s
由于Student是Person的子类,下列语句是正确的:
Person p=new Student();//父类Person对象p引用子类Student的对象 Student s=(Student)p; //父类对象p赋给子类对象s,当前p是子类Student的引用
但是,下列语句有错误:
Person p=new Person();//父类对象p引用父类Person的对象 Student s=(Student)p; //父类对象p不能赋给子类对象s,因为当前p不是子类的引用
上述代码尽管能通过编译,但运行时将抛出ClassCastException异常,强制转换无法实现。
所以综上所述向下转型的特点如下:
(1)向下转型对象可以操作父类及子类成员变量和成员方法。
(2)向下转型对象访问重写父类的方法时,操作的是子类的方法。
(3)向下转型必须进行强制类型转换。
(4)向下转型必须保证父类对象引用的是该子类的对象,如果引用的是父类的其他子类对象,会抛出类型不匹配异常。
3.instanceof运算符
父类对象能转换成子类对象的条件是父类对象原本就是子类的实例。为了确保向下转型时,父类对象引用的是子类的对象,引入instanceof运算,该运算符用来判断该引用变量是否属于该类或该类的子类。
instanceof运算的格式为:
引用变量名 instanceof 类名
如果该引用变量引用的是这个类的对象,或这个类的子类的对象,则运算结果为true;否则为false。