<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
| 向上转型 | 向下转型 |
定义 | 把对某个对象的引用视为对其基类引用的做法 | 将超类的引用强制转换为子类类型 |
作用 | 调用导出类中的覆盖方法 | 调用导出类中的扩展方法 |
|
| |
代码: | ||
public class TestUpCastingOrDownCasting{ public static void main(String[] args){ father[] f = {new father(),new son1(),new son2(),new gs()}; for(int i=0; i< f.length; i++){ System.out.println("==============" + f[i] + "=============="); if(f[i] instanceof son2){ son2 s2 = (son2)f[i]; s2.s(); } f[i].f(); } } }
class father{ public void f(){ System.out.println(" 父类的方法! "); } }
class son1 extends father{ public void f(){ System.out.println(" 儿子 1 继承父类的方法! "); } public void s(){ System.out.println(" 儿子 1 的方法! "); } }
class son2 extends father{ public void f(){ System.out.println(" 儿子 2 继承父类的方法! "); } public void s(){ System.out.println(" 儿子 2 的方法! "); } }
class gs extends son2{ public void f(){ System.out.println(" 孙子通过儿子 2 继承父类的方法! "); } public void s(){ System.out.println(" 孙子继承儿子 2 的方法! "); } public void gs(){ System.out.println(" 孙子的方法! "); } } | ||
输出结果: | ==========father@bdb503========== 父类的方法! ==========son1@b6e39f========== 儿子 1 继承父类的方法! ==========son2@119dc16========== 儿子 2 的方法! 儿子 2 继承父类的方法! ==========gs@c05d3b========== 孙子继承儿子 2 的方法! 孙子通过儿子 2 继承父类的方法! | |
执行语句: | ==========father@bdb503========== father f = new father(); f.f(); === 对父类的操作 ==========son1@b6e39f========== father f = new son1(); f.f(); == 向上转型,覆盖父类的方法 ==========son2@119dc16========== father f = new son2(); son2 s2 = (son2)f; == 向下转型 s2.s(); f.f(); == 向上转型 ==========gs@c05d3b========== father f = new son2(); son2 s2 = (son2)f; s2.s(); f.f(); | |
对 gs@c05d3b 理解: | father f = new son2(); son2 s2 = (son2)f; s2.s(); == 执行语句过程中实现了一次向上转型 son2 s2 = (son2)f; 和向下转型 s2.s(); f.f(); == 实现的是向下转型 |
f[i] instanceof son2 : 判断 instanceof 左边的对象是否是右边的类的实例