49 向上造型与向下造型
向上造型(转型)
定义:超类的引用指向子类对象。
例如:
Animal o1 = new Tiger();//Tiger是Animal的派生类(子类)
以上即为向上转型。
特性:
- 向上转型后的引用只能使用超类中的方法和属性。
- 向上转型后的引用不能使用派生类中自有的方法和属性,可以使用重写父类的方法
向下造型(转型)
将一个已经向上转型的引用强制向下转型,并用一个新的派生类引用接收。
注意:
- 向下转型后的引用既可以使用超类中的也可以使用它自己的类(当前派生类)中的方法和属性。
- 向下转型后需要使用一个派生类引用来接收。
以上面的代码为前提,向下转型:
Tiger o2 = null;//先声明一个需要向下转型为的派生类的引用 if(o1 instanceof Tiger) {//判断当前引用是否指向该派生类的对象 o2 = (Tiger)o1;//向下转型 //o1 = (Tiger)o1;//这样是无法转型成功的,转型不会报错,但o1任然无法调用Tiger中的属性和方法 }
案例完整代码
Tiger类向上转型Animal,之后再向下转型Tiger.
package OOday03; /** * 向上转型 * @author TEDU * Animal a1 = new Tiger(); * 超类的引用a1指向派生类对象new Tiger() 这个就是向上转型 * a1只能使用超类中的方法,不能使用Tiger中的方法 */ public class UploadDemo { public static void main(String[] args) { //向上造型 System.out.println("--------向上造型------------"); Animal o1 = new Tiger(); System.out.println(o1.str1);//向上造型后的o1只能使用超类中的属性 o1.sayHi();//和方法 //向下转型 System.out.println("--------向下造型-----------------"); Tiger o2 = null; if(o1 instanceof Tiger) { o2 = (Tiger)o1; //o1 = (Tiger)o1;//这样是无法转型成功的,转型不会报错,但o1任然无法调用Tiger中的属性和方法 //转型后就可以使用派生类的方法了 System.out.println(o2.str1);//超类中的属性 o2.sayHi();//超类中的方法 System.out.println(o2.str2);//派生类中的属性 o2.sayHello(); } } } class Animal{ String str1 = "超类中的属性"; public void sayHi() { System.out.println("超类中的方法"); } } class Tiger extends Animal{ String str2 = "派生类中的属性"; public void sayHello() { System.out.println("派生类中的方法"); } }
运行结果:
--------向上造型------------ 超类中的属性 超类中的方法 --------向下造型----------------- 超类中的属性 超类中的方法 派生类中的属性 派生类中的方法