Java 多态


在面向对象语言中,多态是继封装和继承之后的第三个基本特征。从一定程度来讲,封装和继承是实现多态的基础。

所谓多态就是同一个消息(方法)可以根据参数对象的不同而表现出不同行为。java中所有方法都是通过“动态绑定”来实现多态的,即程序在运行期间判断参数引用所指向的实际对象类型,然后根据实际对象类型调用其相应的方法,这样就可以只编写和基类打交道的代码。

多态的实现方式有:

  1. 接口的多个实现
  2. 继承父类进行方法重写
  3. 一个类中进行方法重载

多态的形象举例:word中按F1键是word的帮助文档,在eclipse中按F1键是eclipse的帮助文档

向上转型和向下转型

对象可以作为自己本身的类型来使用,也可以作为其基类型使用,将某个类基类型的引用当该类的引用的做法叫做向上转型,由于基类不会具有大于导出类的接口,因此向上转型是安全的,但同时会丢失具体的类型信息。

相反,通过向下转型可以重新获取类型信息,但是明显这样做是不安全的,因为无法知道一个”形状“到底是“圆”还是“三角形”。因此java会对所有转型进行检查,不安全的情况下则会抛出ClassCastException类型转换异常。

class Useful {
    public void f(){
        System.out.println("Useful.f");
    };
    public void g(){
        System.out.println("Useful.g");
    };
}

class MoreUseful extends Useful {
    public void f(){
        System.out.println("MoreUseful.f");
    };
    public void g(){
        System.out.println("MoreUseful.g");
    };
    public void h(){
        System.out.println("MoreUseful.h");
    };
}

public class RTTI {
    static void testCast(Useful useful){
        useful.f();
    }
    public static void main(String[] args) {
        Useful useful = new MoreUseful();
        ((MoreUseful) useful).f();  //输出MoreUseful.f

        Useful useful1 = new MoreUseful();
        ((MoreUseful) useful1).h();  //输出MoreUseful.h

//        Useful useful1 = new Useful();
//        ((MoreUseful) useful1).f(); //向下转型,这时会抛出java.lang.ClassCastException

        MoreUseful moreUseful = new MoreUseful();
        testCast(moreUseful); //向上转型,多态,输出MoreUseful.f
    }

}
Copyright © jverson.com 2019 all right reserved,powered by Gitbook 20:28

results matching ""

    No results matching ""