作者:gnuhpc 
出处:http://www.cnblogs.com/gnuhpc/
见下边的程序段
package test; 
class A { 
    public String f(A obj) 
    { 
        return("A"); 
    } 
} 
class B extends A { 
    public String f(B obj) 
    { 
        return("C"); 
    } 
    public String f(A obj) 
    { 
        return("D"); 
    } 
} 
我们使用子类创建一个对象:
B b = new B();
然后再将这个子类的引用放到父类对象中:
A a;
a = b;
那么这个父类对象a是子类对象b的上转型对象,对象的实体由子类负责建立,实质还是子类,只是损失了一些功能而已,这样的得失具体如下:
得:上转型对象可以操作和使用子类继承或者重写的方法。
失:上转型对象丧失了对子类新增成员变量或新增的方法的操作和使用。
那么下边的这段测试代码的打印结果就是“D”,因为a2只能有public String f(A obj) 这个方法是可以用的。
public class TestObj 
{ 
    public static void main(String args[]) 
    {  A a1 = new A(); 
        A a2 = new B(); //子类对象转化为父类,称为上转型,不需要强制转换。
        B b = new B(); 
        System.out.println(a2.f(b)); //“D” 
System.out.println();
         if (a2 instanceof B) { 
             B b1 = (B) a2;  //父类对象转化为下转型,此时需要使用强制转换,此时需要先判断要转换的这个对象(也就是a2指向的这个对象)是不是B类的实例 
            System.out.println(b1.f(b));//"C" 
            System.out.println(b1.f(a1));//"D" 
        } 
    } 
}  
其实,java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。子类和父类中定义同名的变量时,仅仅是隐藏了,变量没有多态性;而对于覆盖的方法,Java表现出多态性,会调用更具体的子类里面的方法,无论从哪里调用,无论使用什么引用类型调用。
 
另外说说向上转型的作用:由于向上转型的作用,在要传入子类实例的时候,我们可以方便的将父类实例作为参数定义在方法的传入参数上,这样不用利用多态特性进行方法的重载了。其实向上转型也是一种多态特性的体现。
作者:gnuhpc 
出处:http://www.cnblogs.com/gnuhpc/
                作者:gnuhpc 
                出处:http://www.cnblogs.com/gnuhpc/ 
                除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。 
 
                             
                 
                