Java implement polymorphism

来源:互联网 发布:百度浏览器打不开淘宝 编辑:程序博客网 时间:2024/06/08 16:22

本文章转自博客:https://originals-tz.github.io/

何为多态性

多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

多态的作用:消除类型之间的耦合关系。

现实中,关于多态的例子不胜枚举。比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。

多态存在的三个必要条件

一、要有继承;

二、要有重写;

三、父类引用指向子类对象。

何为动态绑定

后期绑定:在运行时根据具体对象的类型进行绑定。

若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。也就是说,编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的。但我们至少可以这样认为:它们都要在对象中安插某些特殊类型的信息。

java当中的向上转型或者说多态是借助于动态绑定实现的,所以理解了动态绑定,也就搞定了向上转型和多态。

前面已经说了对于java当中的方法而言,除了final,static,private和构造方法是前期绑定外,其他的方法全部为动态绑定。而动态绑定的典型发生在父类和子类的转换声明之下:

动态绑定的过程

虚拟机提取对象的实际类型的方法表;

虚拟机搜索方法签名;

调用方法。

比如:C x = new D()

其具体过程细节如下:

1:编译器检查对象的声明类型和方法名。假设我们调用x.f(String)方法,并且x已经被声明为C类的对象,那么编译器会列举出C类中所有的名称为f的方法和从C类的超类继承过来的f方法

2:接下来编译器检查方法调用中提供的参数类型。如果在所有名称为f 的方法中有一个参数类型和调用提供的参数类型最为匹配,那么就调用这个方法,这个过程叫做“重载解析”

3:当程序运行并且使用动态绑定调用方法时,虚拟机必须调用同x所指向的对象的实际类型相匹配的方法版本。假设实际类型为D(C的子类),如果D类定义了f(String)那么该方法被调用,否则就在D的超类中搜寻方法f(String),依次类推

对于多态,可以总结以下几点:

一、使用父类类型的引用指向子类的对象;

* 二、该引用只能调用父类中定义的方法和变量;*

三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)

四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。

实例

public class Test_implementPolymorphism {    public static void main(String[] args)    {        A a1 = new A();        A a2 = new B();        B b = new B();        B b2 = new B();        a1.show(b); //A.show(A o)        a2.show(a1); //B.show(A o)        a2.show(b); //B.show(A o)        b.show(b2); //B.show(B o)    }}class A {    public void show(A o)    {        System.out.println("A and A");    }}class B extends A {  //重写父类方法    public void show(A o) {        System.out.println("B and A");    }    public void  show(B o) {        System.out.println("B and B");    }}

Out Put

A and AB and AB and AB and B

当注释掉子类的show(A o)

public class Test_implementPolymorphism {    public static void main(String[] args)    {        A a1 = new A();        A a2 = new B();        B b = new B();        B b2 = new B();        a1.show(b); //A.show(A)        a2.show(b); //A.show(A)        a2.show(a1); //A.show(A)        b.show(b2); //B.show(B)    }}class A {    public void show(A o)    {        System.out.println("A and A");    }}class B extends A {    /*    public void show(A o) {        System.out.println("B and A");    }*/    public void  show(B o) {        System.out.println("B and B");    }}

out Put

A and AA and AA and AB and B