在Java中,繼承是一個(gè)非常重要的概念。在子類繼承父類時(shí),子類可以繼承父類中的方法和屬性。有時(shí)候,子類需要重新定義一個(gè)與父類中已有的方法或?qū)傩韵嗤姆椒ɑ驅(qū)傩浴_@時(shí)候就需要了解Java中的覆蓋和隱藏之間的區(qū)別。
覆蓋(Override)是指在子類中重新定義一個(gè)與父類中同名同參數(shù)的方法。當(dāng)子類對(duì)象調(diào)用該方法時(shí),將會(huì)執(zhí)行子類中的方法代碼,而不是父類中的方法代碼。以下是一個(gè)簡(jiǎn)單的示例:
class Animal { public void move() { System.out.println("動(dòng)物可以移動(dòng)"); } } class Dog extends Animal { public void move() { System.out.println("狗可以跑和走"); } } public class TestDog { public static void main(String args[]) { Animal a = new Animal(); // Animal 對(duì)象 Animal b = new Dog(); // Dog 對(duì)象 a.move(); // 執(zhí)行 Animal 類的方法 b.move(); // 執(zhí)行 Dog 類的方法 } }
在上面的例子中,兩個(gè)對(duì)象分別是 Animal 和 Dog 類型的。當(dāng)執(zhí)行 a.move() 方法時(shí),將會(huì)輸出 "動(dòng)物可以移動(dòng)";而執(zhí)行 b.move() 方法時(shí),將會(huì)輸出 "狗可以跑和走"。因此,我們可以看到在 Dog 類中對(duì) move() 方法進(jìn)行了覆蓋。
相對(duì)而言,隱藏(Hide)則是指在子類中定義一個(gè)與父類中同名不同參數(shù)的方法或?qū)傩浴.?dāng)子類對(duì)象調(diào)用該方法或?qū)傩詴r(shí),將會(huì)執(zhí)行子類的方法或?qū)傩裕皇歉割愔械耐椒ɑ驅(qū)傩浴R韵率且粋€(gè)簡(jiǎn)單的示例:
class Animal { public void move() { System.out.println("動(dòng)物可以移動(dòng)"); } } class Dog extends Animal { public void move(int distance) { System.out.println("狗可以跑 " + distance + " 米"); } } public class TestDog { public static void main(String args[]) { Animal a = new Animal(); // Animal 對(duì)象 Animal b = new Dog(); // Dog 對(duì)象 a.move(); // 執(zhí)行 Animal 類的方法 b.move(10); // 執(zhí)行 Dog 類的方法 } }
在上面的例子中,Dog 類中定義了一個(gè)與 Animal 類中不同參數(shù)的 move() 方法。當(dāng)執(zhí)行 a.move() 方法時(shí),將會(huì)輸出 "動(dòng)物可以移動(dòng)";而執(zhí)行 b.move(10) 方法時(shí),將會(huì)輸出 "狗可以跑 10 米"。因此,我們可以看到在 Dog 類中對(duì) move() 方法進(jìn)行了隱藏。