java向上转型

来源:互联网 发布:ubuntu 14.04 麒麟 编辑:程序博客网 时间:2024/05/04 21:17

java向上转型

首先来了解一下下面的知识点:

    1转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。

    2,“动态绑定”也即后期绑定,意指在运行期间判断对象的类型并以此来判定去调用适当的方法。java属于后期绑定。在java中,几乎所有的方法都是后期绑定的,在运行时去动态的绑定一个方法是属于子类还是属于基类。

 

向上转型:子类引用的对象转换为父类类型称为向上转型,或者说把子类对象直接赋给父类引用。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口.

Father father = new Son();  //向上转型,父类引用指向子类对象

 

看下面的1

public class Father{

    public void f1() {

       System.out.println("Father 的 method");

}

}

Father的子类Son:

public class Son extends Father {

    public void f1() {

       System.out.println("Son 的 method"); //覆盖父类的方法@override

}

       public void s1(){} //Son类定义了自己的新方法

public static void main(String[] args) {     

  Father a = new Son();//向上转型     

  a.fl();     

  }     

}

        那么上面程序的运行结果会是什么呢?输出的是“Father 的 method”还是“Son 的 method”?事实上输出的结果是:Son 的 method 。分析一下,首先Father a = new Son();声明的是父类的引用,但是执行的过程中调用的是子类的对象,所以程序首先寻找子类对象的f1方法,由于子类重写了父类的f1方法,根据“动态绑定”的理论知道程序会去调用子类的f1方法去执行,因为子类对象有f1方法而没有向上转型去寻找。那么我们再接着看下面的一段代码段2

public class Father{

    public void f1() {

       System.out.println("Father 的 method");

}

}

Father的子类Son:

public class Son extends Father {

       public void s1(){} //Son类定义的方法

public static void main(String[] args) {     

  Father a = new Son();//向上转型     

  a.fl();     

  }     

}

        这时Father a = new Son()声明的仍然是父类的引用,执行过程中调用的也仍然是子类的对象,程序首先会去寻找子类对象的f1方法,但是没有找到,于是就会向上转型去父类寻找f1方法,这时会顺利的找到,将会给出的结果是:Father 的 method

        这里我们需要注意,在向上转型时,父类指向子类引用对象会遗失除与父类对象共有的其他方法,也就是在转型过程中,子类的新有的方法都会遗失掉,在编译时,系统会提供找不到方法的错误  

        但是,值得注意的是在处理java类中的成员变量时,并不是采用运行时绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以找到子类,而对象的属性还是父类的属性。

0 0
原创粉丝点击