解釋什麼是方法過載和覆蓋

方法重寫和過載是 Java 支援的兩種形式的多型。

方法過載

方法過載(也稱為靜態多型)是一種在單個類中具有相同名稱的兩個(或多個)方法(函式)的方法。是的,它就這麼簡單。

public class Shape{
    //It could be a circle or rectangle or square
    private String type;
    
    //To calculate area of rectangle
    public Double area(Long length, Long breadth){
        return (Double) length * breadth;
    }
    
     //To calculate area of a circle
     public Double area(Long radius){
        return (Double) 3.14 * r * r;
    }
}

這樣,使用者可以根據其具有的形狀型別為區域呼叫相同的方法。

但現在真正的問題是,java 編譯器將如何區分執行哪個方法體?

Java 已經清楚地表明,即使方法名稱 (在我們的例子中是 area()可以相同,但引數方法正在採用的應該是不同的。

過載方法必須具有不同的引數列表(數量和型別)。

這就是說我們不能新增另一種方法來計算這樣的正方形區域:public Double area(Long side) 因為在這種情況下,它會與圓區域方法衝突並且會導致 java 編譯器的歧義

感謝上帝,在編寫過載方法時會有一些放鬆

可能有不同的退貨型別。

可能有不同的訪問修飾符。

可能丟擲不同的例外。

為什麼這稱為靜態多型?

那是因為要呼叫哪些過載方法是在編譯時根據引數的實際數量和引數的編譯時型別決定的。

使用方法過載的一個常見原因是它提供的程式碼簡單。例如,記得 String.valueOf() 幾乎可以採用任何型別的引數嗎?在幕後寫的內容可能是這樣的: -

static String valueOf(boolean b) 
static String valueOf(char c) 
static String valueOf(char[] data) 
static String valueOf(char[] data, int offset, int count) 
static String valueOf(double d) 
static String valueOf(float f) 
static String valueOf(int i) 
static String valueOf(long l) 
static String valueOf(Object obj) 

方法重寫

嗯,方法重寫(是的,你猜對了,它也被稱為動態多型)是一個更有趣和複雜的主題。

在方法重寫中,我們覆蓋父類提供的方法體。得到它了?沒有?我們來看一個例子吧。

public abstract class Shape{
    
    public abstract Double area(){
        return 0.0;
    }
}

所以我們有一個名為 Shape 的類,它有一個叫做 area 的方法,它可能會返回形狀的區域。

現在假設我們有兩個名為 Circle 和 Rectangle 的類。

public class Circle extends Shape {
    private Double radius = 5.0;

    // See this annotation @Override, it is telling that this method is from parent
    // class Shape and is overridden here
    @Override
    public Double area(){
        return 3.14 * radius * radius;
    }
}

類似矩形類:

 public class Rectangle extends Shape {
    private Double length = 5.0;
    private Double breadth= 10.0;

    // See this annotation @Override, it is telling that this method is from parent
    // class Shape and is overridden here
    @Override
    public Double area(){
        return length * breadth;
    }
}

所以,現在你的兩個子類都已經更新了父類(Shape)類提供的方法體。現在問題是如何看到結果?好吧,讓我們做舊的 psvm 方式。

public class AreaFinder{
    
    public static void main(String[] args){

        //This will create an object of circle class
        Shape circle = new Circle();
        //This will create an object of Rectangle class
        Shape rectangle = new Rectangle();
        
        // Drumbeats ......
        //This should print 78.5
        System.out.println("Shape of circle : "+circle.area());

        //This should print 50.0
        System.out.println("Shape of rectangle: "+rectangle.area());            
        
    }
}

哇! 不是很棒嗎?兩個相同型別的物件呼叫相同的方法並返回不同的值。我的朋友,這是動態多型的力量。

這是一張圖表,可以更好地比較這兩者之間的差異: -

方法過載 方法重寫
方法過載用於增加程式的可讀性。 方法重寫用於提供其超類已經提供的方法的特定實現。
方法過載在類中執行。 方法重寫發生在具有 IS-A(繼承)關係的兩個類中。
在方法過載的情況下,引數必須不同。 在方法重寫的情況下,引數必須相同。
方法過載是編譯時多型的一個例子。 方法重寫是執行時多型的示例。
在 java 中,只能通過更改方法的返回型別來執行方法過載。返回型別在方法過載方面可以相同或不同。但你必須更改引數。 方法重寫中的返回型別必須相同或協變。