更新時(shí)間:2023-03-23 來(lái)源:黑馬程序員 瀏覽量:
IT就到黑馬程序員.gif)
在面向?qū)ο缶幊讨校?quot;Overload"和"Override"是兩個(gè)重要的概念,用于描述不同類(lèi)型的函數(shù)重寫(xiě)。
Overload是指在同一類(lèi)中定義了多個(gè)同名的方法,但每個(gè)方法具有不同的參數(shù)列表。Java會(huì)根據(jù)傳遞的參數(shù)類(lèi)型和數(shù)量來(lái)確定哪個(gè)方法應(yīng)該被調(diào)用。
例如,在下面的示例中,有兩個(gè)具有相同名稱(chēng)的方法 "print", 但是它們接收的參數(shù)類(lèi)型不同:
public class MyClass {
public void print(int x) {
System.out.println("The integer value is " + x);
}
public void print(String x) {
System.out.println("The string value is " + x);
}
}在這個(gè)示例中,如果你調(diào)用print(10),它會(huì)調(diào)用第一個(gè)方法,如果你調(diào)用print("Hello"),它會(huì)調(diào)用第二個(gè)方法。
Override是指在子類(lèi)中重新定義了父類(lèi)中已經(jīng)定義的方法。這個(gè)方法必須有相同的名稱(chēng)、參數(shù)列表和返回類(lèi)型。在這種情況下,當(dāng)你在子類(lèi)中調(diào)用該方法時(shí),將調(diào)用子類(lèi)中的版本而不是父類(lèi)中的版本。
例如,在下面的示例中,有一個(gè)父類(lèi) "Animal",其中有一個(gè)名為 "makeSound()" 的方法。然后有一個(gè)子類(lèi) "Dog",該子類(lèi)重新定義了 "makeSound()" 方法:
class Animal {
public void makeSound() {
System.out.println("Animal is making a sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof");
}
}在這個(gè)示例中,如果你創(chuàng)建了一個(gè)"Dog"對(duì)象,并調(diào)用makeSound()方法,它將打印出"Woof",而不是 "Animal is making a sound"。
下面是完整的示例代碼,展示了 Overload 和 Override 的區(qū)別:
public class MyClass {
public static void main(String[] args) {
// Overload 示例
MyClass myClass = new MyClass();
myClass.print(10);
myClass.print("Hello");
// Override 示例
Animal animal = new Animal();
animal.makeSound();
Dog dog = new Dog();
dog.makeSound();
}
// Overload 示例
public void print(int x) {
System.out.println("The integer value is " + x);
}
public void print(String x) {
System.out.println("The string value is " + x);
}
}
class Animal {
public void makeSound() {
System.out.println("Animal is making a sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof");
}
} 運(yùn)行代碼,將輸出以下內(nèi)容:
The integer value is 10 The string value is Hello Animal is making a sound Woof
這證明了 Overload 和 Override 的區(qū)別。在 Overload 示例中,不同參數(shù)類(lèi)型的方法可以共享相同的名稱(chēng)。而在 Override 示例中,子類(lèi)重寫(xiě)了父類(lèi)的方法,并且在調(diào)用該方法時(shí)將調(diào)用子類(lèi)中的版本。
需要注意的是,Override只能在子類(lèi)中重新定義方法。如果你嘗試在同一個(gè)類(lèi)中重新定義方法,編譯器會(huì)報(bào)錯(cuò)。另外,在Override中,子類(lèi)方法必須具有與父類(lèi)方法相同的返回類(lèi)型。如果返回類(lèi)型不同,編譯器將報(bào)錯(cuò)。
但是,Overriding方法的返回類(lèi)型必須與父類(lèi)方法的返回類(lèi)型相同或是其子類(lèi)型。這是因?yàn)樵谶\(yùn)行時(shí),Java虛擬機(jī)會(huì)根據(jù)方法的返回類(lèi)型來(lái)確定需要分配多少內(nèi)存來(lái)存儲(chǔ)返回值,如果返回類(lèi)型不同,可能會(huì)導(dǎo)致類(lèi)型轉(zhuǎn)換錯(cuò)誤或其他運(yùn)行時(shí)異常。
在Java中,Overloaded的方法可以改變返回值的類(lèi)型,只要方法的簽名不同。方法的簽名是由方法名稱(chēng)和參數(shù)列表組成的,如果兩個(gè)方法的名稱(chēng)和參數(shù)列表不同,那么它們的返回值可以不同。
例如,假設(shè)有兩個(gè)方法:
public int sum(int a, int b) {
return a + b;
}
public double sum(double a, double b) {
return a + b;
}這兩個(gè)方法都叫做sum,但是它們的參數(shù)類(lèi)型不同,一個(gè)是int類(lèi)型,一個(gè)是double類(lèi)型。由于它們的簽名不同,因此可以返回不同的類(lèi)型。
當(dāng)調(diào)用這些方法時(shí),編譯器會(huì)根據(jù)參數(shù)的類(lèi)型來(lái)選擇正確的方法。例如,如果調(diào)用sum(2, 3),則會(huì)調(diào)用第一個(gè)方法,返回int類(lèi)型的結(jié)果5。如果調(diào)用sum(2.5, 3.5),則會(huì)調(diào)用第二個(gè)方法,返回double類(lèi)型的結(jié)果6.0。
需要注意的是,如果兩個(gè)方法的簽名相同,但是返回值類(lèi)型不同,那么編譯器將無(wú)法確定調(diào)用哪個(gè)方法,會(huì)導(dǎo)致編譯錯(cuò)誤。因此,Overloaded的方法必須具有不同的簽名。
1024首播|39歲程序員逆襲記:不被年齡定義,AI浪潮里再迎春天
2025-10-241024程序員節(jié)丨10年同行,致敬用代碼改變世界的你
2025-10-24【AI設(shè)計(jì)】北京143期畢業(yè)僅36天,全員拿下高薪offer!黑馬AI設(shè)計(jì)連續(xù)6期100%高薪就業(yè)
2025-09-19【跨境電商運(yùn)營(yíng)】深圳跨境電商運(yùn)營(yíng)畢業(yè)22個(gè)工作日,就業(yè)率91%+,最高薪資達(dá)13500元
2025-09-19【AI運(yùn)維】鄭州運(yùn)維1期就業(yè)班,畢業(yè)14個(gè)工作日,班級(jí)93%同學(xué)已拿到Offer, 一線均薪資 1W+
2025-09-19【AI鴻蒙開(kāi)發(fā)】上海校區(qū)AI鴻蒙開(kāi)發(fā)4期5期,距離畢業(yè)21天,就業(yè)率91%,平均薪資14046元
2025-09-19