Java教程 目录

Java多态

Java中的多态是一个概念,通过它我们可以通过不同的方式执行单个动作(方法)。 多态性派生自2个希腊词:“poly”和“morphs”。 词语“poly”意为许多,“morphs”意为形式。 所以多态表示为多种形式。

在Java中有两种类型的多态性:编译时多态性和运行时多态性。 我们可以通过方法重载和方法覆盖在java中执行多态性。

如果在Java中重载静态方法,它就是编译时多态性的例子。 这里,我们将关注Java中的运行时多态性。

1. Java运行时多态性

运行时多态性或动态方法分派是一个过程,它对重写方法的调用在运行时体现而不是编译时。

在此过程中,通过超类的引用变量调用重写的方法。 要调用的方法基于引用的对象。

了解运行时多态性之前,让我们先来向上转换。

向上转换

当父类的引用变量引用子类的对象时,称为向上转换。 例如:

----- ---  
----- - ------- ---  
- ----- ----  ---------

Java运行时多态性示例1

在这个例子中,我们创建两个类:BikeSplendarSplendar类扩展Bike类并覆盖其run()方法。通过父类(Bike)的引用变量调用run方法。 因为它引用子类对象,并且子类方法覆盖父类方法,子类方法在运行时被调用。

---------------------------------
----- ---- -
    ---- ----- -
        ------------------------------
    -
-

----- -------- ------- ---- -
    ---- ----- -
        --------------------------- ------ ---- -------
    -

    ------ ------ ---- ----------- ------- -
        ---- - - --- ------------- --------- - ----
        --------
    -
-

执行上面代码得到以下结果 -

------- ------ ---- -----

Java运行时多态性示例2:Bank

考虑一种情况,Bank类是一个提供获得利率的方法的类。 但是,利率可能因银行而异。 例如,SBIICICIAXIS银行分别提供8.4%7.3%9.7%的利率。

注意:此示例也在方法覆盖中给出,但没有向上转换。

----- ---- -
    ----- ------------------- -
        ------ --
    -
-

----- --- ------- ---- -
    ----- ------------------- -
        ------ -----
    -
-

----- ----- ------- ---- -
    ----- ------------------- -
        ------ -----
    -
-

----- ---- ------- ---- -
    ----- ------------------- -
        ------ -----
    -
-

----- ---------------- -
    ------ ------ ---- ----------- ------- -
        ---- --
        - - --- ------
        ----------------------- ---- -- --------- - - -----------------------
        - - --- --------
        ------------------------- ---- -- --------- - - -----------------------
        - - --- -------
        ------------------------ ---- -- --------- - - -----------------------
    -
-

上面代码执行结果如下 -

--- ---- -- --------- ---
----- ---- -- --------- ---
---- ---- -- --------- ---

Java运行时多态性示例3:Shape

----- ----- - -- ------
    ---- ------ -
        ---------------------------------
    -
-

----- --------- ------- ----- -
    ---- ------ -
        --------------------------- ---------------
    -
-

----- ------ ------- ----- -
    ---- ------ -
        --------------------------- ------------
    -
-

----- -------- ------- ----- -
    ---- ------ -
        --------------------------- --------------
    -
-

----- ----------------- -
    ------ ------ ---- ----------- ------- -
        ----- --
        - - --- ------------
        ---------
        - - --- ---------
        ---------
        - - --- -----------
        ---------
    -
-

上面代码执行结果如下 -

------- ------------
------- ---------
------- -----------

Java运行时多态性示例4:Animal

----- ------ -
    ---- ----- -
        --------------------------------
    -
-

----- --- ------- ------ -
    ---- ----- -
        -------------------------- -----------
    -
-

----- --- ------- ------ -
    ---- ----- -
        -------------------------- ---------
    -
-

----- ---- ------- ------ -
    ---- ----- -
        -------------------------- ----------
    -
-

----- ----------------- -
    ------ ------ ---- ------------- ----- -
        ------ --
        - - --- ------
        --------
        - - --- ------
        --------
        - - --- -------
        --------
    -
-

上面代码执行结果如下 -

------ --------
------ ------
------ -------

Java运行时多态性与数据成员

上面示例中,都是有关方法被覆盖而不是数据成员,因此运行时多态性不能由数据成员实现。
在下面给出的例子中,这两个类都有一个数据成员:speedlimit,通过引用子类对象的父类的引用变量来访问数据成员。 由于我们访问的数据成员没有被重写,因此它将访问父类的数据成员。

规则: 运行时多态性不能由数据成员实现。

----- ---- -
    --- ---------- - ---
-

----- ------ ------- ---- -
    --- ---------- - ----

    ------ ------ ---- ----------- --------  
        ---- ------- ---------  
        --------------------------------------- 
    -
-

上面代码执行结果如下 -

--

Java运行时多态性与多级继承

下面让我们来看看一个带有多级继承的运行时多态性的简单例子。

----- ------ -
    ---- ----- -
        -----------------------------
    -
-

----- --- ------- ------ -
    ---- ----- -
        -------------------------- ---------
    -
-

----- ------- ------- --- -
    ---- ----- -
        ---------------------------- -------
    -

    ------ ------ ---- ----------- ------- -
        ------ --- --- ---
        -- - --- ---------
        -- - --- ------
        -- - --- ----------
        ---------
        ---------
        ---------
    -
-

上面代码执行结果如下 -

------
------ ------
-------- ----

尝试下面一段代码的输出:

----- ------ -
    ---- ----- -
        -------------------------- -- ------------
    -
-

----- --- ------- ------ -
    ---- ----- -
        ----------------------- -- ------------
    -
-

----- -------- ------- --- -
    ------ ------ ---- ----------- ------- -
        ------ - - --- -----------
        --------
    -
-

执行上述代码,结果如下:

--- -- ------

因为,BabyDog不会覆盖eat()方法,所以这里是Dog类的eat()方法被调用。


上一篇:Java final关键字
下一篇:Java静态绑定和动态绑定