向上造型(转型)
定义:超类的引用指向子类对象。
例如:
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("派生类中的方法");
}
}
运行结果:
--------向上造型------------ 超类中的属性 超类中的方法 --------向下造型----------------- 超类中的属性 超类中的方法 派生类中的属性 派生类中的方法