多態是面向對象的重要概念之一,在Java等編程語言中得到了廣泛的應用。多態主要指同一個方法或者類在不同的環境下呈現出不同的行為表現形式。根據Java中多態的表現形式不同,可以將其分為三類:方法重載、方法重寫和接口實現。接下來從這三個方面,詳細介紹多態的三種表現形式。
一、方法重載
方法重載,指的是在同一個類中定義多個同名的方法,但參數列表不同。這樣,在調用方法時,根據實際傳入的參數類型或個數的不同,會自動識別並調用相應的方法。方法的返回值和訪問修飾符對方法重載並沒有約束作用。
方法重載示例
public class Polygon { public void draw() { System.out.println("繪製圖形"); } public void draw(String color) { System.out.println("繪製" + color + "圖形"); } public void draw(int x, int y) { System.out.println("在(" + x + ", " + y + ")處繪製圖形"); } }
在上述示例中,Polygon類中定義了三個同名方法draw(),但方法的參數列表分別為無參、一個String類型參數和兩個int類型參數。以下是方法重載的使用示例:
Polygon polygon = new Polygon(); polygon.draw(); // 輸出:繪製圖形 polygon.draw("紅色"); // 輸出:繪製紅色圖形 polygon.draw(10, 20); // 輸出:在(10, 20)處繪製圖形
通過上述示例,我們可以看出,由於Polygon.draw()方法被重載了,可以根據傳入的參數類型或個數的不同,自動判斷調用哪個方法。
二、方法重寫
方法重寫,指的是在子類中定義一個同名的方法,且方法簽名(返回值類型、方法名、參數列表)與父類中的方法相同,從而實現對父類方法的重新編寫。在方法重寫中,子類中的方法將覆蓋父類中同名的方法,這種覆蓋是在運行時動態決定的。如果子類中的方法簽名和父類中的方法簽名不一致,那麼子類中的方法在父類中就相當於是新增了一個方法,不是方法的重寫。
方法重寫示例
public class Animal { public void speak() { System.out.println("動物發出聲音"); } } public class Cat extends Animal { public void speak() { System.out.println("貓發出「喵喵喵」的聲音"); } } public class Dog extends Animal { public void speak() { System.out.println("狗發出「汪汪汪」的聲音"); } }
在上述示例中,Animal類中定義了一個speak()方法,Cat類和Dog類分別繼承Animal類,並分別重寫了speak()方法。以下是方法重寫的使用示例:
Animal animal1 = new Cat(); Animal animal2 = new Dog(); animal1.speak(); // 輸出:貓發出「喵喵喵」的聲音 animal2.speak(); // 輸出:狗發出「汪汪汪」的聲音
通過上述示例,我們可以看出,由於Cat類和Dog類重寫了Animal類中的speak()方法,所以在調用時,會根據實際調用的對象類型,自動決定調用哪個方法。
三、接口實現
接口實現,指的是一個類實現了某個接口,並實現了該接口中定義的所有方法。在Java中,接口是一種抽象類型,其中只定義了方法簽名和常量,而沒有具體的方法實現。當一個類實現了某個接口,就必須實現接口中定義的所有方法。通過接口實現,可以實現不同類之間的代碼復用,提高代碼的可維護性和可重用性。
接口實現示例
public interface Shape { double area(); // 定義計算面積的方法 double perimeter(); // 定義計算周長的方法 } public class Circle implements Shape { private double radius; public Circle(double radius) { this.radius = radius; } public double area() { return Math.PI * radius * radius; } public double perimeter() { return 2 * Math.PI * radius; } } public class Rectangle implements Shape { private double length; private double width; public Rectangle(double length, double width) { this.length = length; this.width = width; } public double area() { return length * width; } public double perimeter() { return 2 * (length + width); } }
在上述示例中,Shape接口定義了計算面積和周長的方法,Circle類和Rectangle類實現了Shape接口,並分別實現了area()和perimeter()方法。以下是接口實現的使用示例:
Shape shape1 = new Circle(5); Shape shape2 = new Rectangle(3, 4); System.out.println("圓的面積是:" + shape1.area()); // 輸出:圓的面積是78.53981633974483 System.out.println("圓的周長是:" + shape1.perimeter()); // 輸出:圓的周長是31.41592653589793 System.out.println("矩形的面積是:" + shape2.area()); // 輸出:矩形的面積是12.0 System.out.println("矩形的周長是:" + shape2.perimeter()); // 輸出:矩形的周長是14.0
通過上述示例,我們可以看出,由於Circle類和Rectangle類都實現了Shape接口,並實現了接口中定義的所有方法,所以在調用時,可以通過Shape類型的引用來調用其實現的方法。
原創文章,作者:DXQTD,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/334765.html