鍍金池/ 教程/ Java/ Java多態(tài)
Java for循環(huán)
Java接口
Java是什么?
Java命名約定
java中方法重載和方法重寫的區(qū)別
Java運(yùn)算符
Java抽象類
Java快速入門
Java實(shí)例初始化程序塊
Java靜態(tài)綁定和動態(tài)綁定
Java do-while循環(huán)
Java對象克隆
Java Object類
Java聚合
Java繼承
Java this關(guān)鍵字
Java虛擬機(jī)內(nèi)部體系結(jié)構(gòu)
Java構(gòu)造器(構(gòu)造方法)
Eclipse安裝和配置
Java多態(tài)
Java方法重載
Java while循環(huán)
Java教程
Java按值調(diào)用和引用調(diào)用
Java strictfp關(guān)鍵字
Java封裝
Java語言特點(diǎn)
Java數(shù)組
Java instanceof運(yùn)算符
Java包裝類
Java命令行參數(shù)
Java包
Java面向?qū)ο螅∣OP)概念
簡單Java程序
Java基礎(chǔ)實(shí)例程序
Java對象和類
Java continue語句
Java抽象類和接口的區(qū)別
C++ VS Java比較
Java if/else語句
Java switch語句
Java歷史
Java變量和數(shù)據(jù)類型
安裝Java環(huán)境(Linux)
Java JDK安裝和配置
Hello Java程序的內(nèi)部細(xì)節(jié)
Java break語句
Java方法重寫
Java Unicode編碼系統(tǒng)
怎么樣開始學(xué)習(xí)Java編程?
對象和類之間的區(qū)別
Java訪問修飾符
Java super關(guān)鍵字
Java注釋
JDK,JRE和JVM之間的區(qū)別
Java final關(guān)鍵字
Java static關(guān)鍵字

Java多態(tài)

Java中的多態(tài)是一個(gè)概念,通過它我們可以通過不同的方式執(zhí)行單個(gè)動作(方法)。 多態(tài)性派生自2個(gè)希臘詞:“poly”和“morphs”。 詞語“poly”意為許多,“morphs”意為形式。 所以多態(tài)表示為多種形式。

在Java中有兩種類型的多態(tài)性:編譯時(shí)多態(tài)性和運(yùn)行時(shí)多態(tài)性。 我們可以通過方法重載和方法覆蓋在java中執(zhí)行多態(tài)性。

如果在Java中重載靜態(tài)方法,它就是編譯時(shí)多態(tài)性的例子。 這里,我們將關(guān)注Java中的運(yùn)行時(shí)多態(tài)性。

1. Java運(yùn)行時(shí)多態(tài)性

運(yùn)行時(shí)多態(tài)性或動態(tài)方法分派是一個(gè)過程,它對重寫方法的調(diào)用在運(yùn)行時(shí)體現(xiàn)而不是編譯時(shí)。

在此過程中,通過超類的引用變量調(diào)用重寫的方法。 要調(diào)用的方法基于引用的對象。

了解運(yùn)行時(shí)多態(tài)性之前,讓我們先來向上轉(zhuǎn)換。

向上轉(zhuǎn)換

當(dāng)父類的引用變量引用子類的對象時(shí),稱為向上轉(zhuǎn)換。 例如:

class A{}  
class B extends A{}  
A a=new B();  //向上轉(zhuǎn)換...

Java運(yùn)行時(shí)多態(tài)性示例1

在這個(gè)例子中,我們創(chuàng)建兩個(gè)類:BikeSplendar。 Splendar類擴(kuò)展Bike類并覆蓋其run()方法。通過父類(Bike)的引用變量調(diào)用run方法。 因?yàn)樗米宇悓ο?,并且子類方法覆蓋父類方法,子類方法在運(yùn)行時(shí)被調(diào)用。

因?yàn)榉椒ㄕ{(diào)用是由JVM不是編譯器決定的,所以它被稱為運(yùn)行時(shí)多態(tài)性。
class Bike {
    void run() {
        System.out.println("running");
    }
}

class Splender extends Bike {
    void run() {
        System.out.println("running safely with 60km");
    }

    public static void main(String args[]) {
        Bike b = new Splender();// upcasting - 向上轉(zhuǎn)換
        b.run();
    }
}

執(zhí)行上面代碼得到以下結(jié)果 -

running safely with 60km.

Java運(yùn)行時(shí)多態(tài)性示例2:Bank

考慮一種情況,Bank類是一個(gè)提供獲得利率的方法的類。 但是,利率可能因銀行而異。 例如,SBI,ICICIAXIS銀行分別提供8.4%,7.3%9.7%的利率。

注意:此示例也在方法覆蓋中給出,但沒有向上轉(zhuǎn)換。

class Bank {
    float getRateOfInterest() {
        return 0;
    }
}

class SBI extends Bank {
    float getRateOfInterest() {
        return 8.4f;
    }
}

class ICICI extends Bank {
    float getRateOfInterest() {
        return 7.3f;
    }
}

class AXIS extends Bank {
    float getRateOfInterest() {
        return 9.7f;
    }
}

class TestPolymorphism {
    public static void main(String args[]) {
        Bank b;
        b = new SBI();
        System.out.println("SBI Rate of Interest: " + b.getRateOfInterest());
        b = new ICICI();
        System.out.println("ICICI Rate of Interest: " + b.getRateOfInterest());
        b = new AXIS();
        System.out.println("AXIS Rate of Interest: " + b.getRateOfInterest());
    }
}

上面代碼執(zhí)行結(jié)果如下 -

SBI Rate of Interest: 8.4
ICICI Rate of Interest: 7.3
AXIS Rate of Interest: 9.7

Java運(yùn)行時(shí)多態(tài)性示例3:Shape

class Shape { // 基類(形狀)
    void draw() {
        System.out.println("drawing...");
    }
}

class Rectangle extends Shape {
    void draw() {
        System.out.println("drawing rectangle...");
    }
}

class Circle extends Shape {
    void draw() {
        System.out.println("drawing circle...");
    }
}

class Triangle extends Shape {
    void draw() {
        System.out.println("drawing triangle...");
    }
}

class TestPolymorphism2 {
    public static void main(String args[]) {
        Shape s;
        s = new Rectangle();
        s.draw();
        s = new Circle();
        s.draw();
        s = new Triangle();
        s.draw();
    }
}

上面代碼執(zhí)行結(jié)果如下 -

SBI Rate of Interest: 8.4
ICICI Rate of Interest: 7.3
AXIS Rate of Interest: 9.7

Java運(yùn)行時(shí)多態(tài)性示例4:Animal

class Animal {
    void eat() {
        System.out.println("eating...");
    }
}

class Dog extends Animal {
    void eat() {
        System.out.println("eating bread...");
    }
}

class Cat extends Animal {
    void eat() {
        System.out.println("eating rat...");
    }
}

class Lion extends Animal {
    void eat() {
        System.out.println("eating meat...");
    }
}

class TestPolymorphism3 {
    public static void main(String[] args) {
        Animal a;
        a = new Dog();
        a.eat();
        a = new Cat();
        a.eat();
        a = new Lion();
        a.eat();
    }
}

上面代碼執(zhí)行結(jié)果如下 -

eating bread...
eating rat...
eating meat...

Java運(yùn)行時(shí)多態(tài)性與數(shù)據(jù)成員

上面示例中,都是有關(guān)方法被覆蓋而不是數(shù)據(jù)成員,因此運(yùn)行時(shí)多態(tài)性不能由數(shù)據(jù)成員實(shí)現(xiàn)。
在下面給出的例子中,這兩個(gè)類都有一個(gè)數(shù)據(jù)成員:speedlimit,通過引用子類對象的父類的引用變量來訪問數(shù)據(jù)成員。 由于我們訪問的數(shù)據(jù)成員沒有被重寫,因此它將訪問父類的數(shù)據(jù)成員。

規(guī)則: 運(yùn)行時(shí)多態(tài)性不能由數(shù)據(jù)成員實(shí)現(xiàn)。

class Bike {
    int speedlimit = 90;
}

class Honda3 extends Bike {
    int speedlimit = 150;

    public static void main(String args[]){  
        Bike obj=new Honda3();  
        System.out.println(obj.speedlimit);//90 
    }
}

上面代碼執(zhí)行結(jié)果如下 -

90

Java運(yùn)行時(shí)多態(tài)性與多級繼承

下面讓我們來看看一個(gè)帶有多級繼承的運(yùn)行時(shí)多態(tài)性的簡單例子。

class Animal {
    void eat() {
        System.out.println("eating");
    }
}

class Dog extends Animal {
    void eat() {
        System.out.println("eating fruits");
    }
}

class BabyDog extends Dog {
    void eat() {
        System.out.println("drinking milk");
    }

    public static void main(String args[]) {
        Animal a1, a2, a3;
        a1 = new Animal();
        a2 = new Dog();
        a3 = new BabyDog();
        a1.eat();
        a2.eat();
        a3.eat();
    }
}

上面代碼執(zhí)行結(jié)果如下 -

eating
eating fruits
drinking Milk

嘗試下面一段代碼的輸出:

class Animal {
    void eat() {
        System.out.println("animal is eating...");
    }
}

class Dog extends Animal {
    void eat() {
        System.out.println("dog is eating...");
    }
}

class BabyDog1 extends Dog {
    public static void main(String args[]) {
        Animal a = new BabyDog1();
        a.eat();
    }
}

執(zhí)行上述代碼,結(jié)果如下:

Dog is eating

因?yàn)椋?code>BabyDog不會覆蓋eat()方法,所以這里是Dog類的eat()方法被調(diào)用。


上一篇:Java聚合下一篇:Java方法重載