⑴ java為什麼要用多態,什麼是多態
多態性在Java編程中是一種核心概念,它允許使用同一類名的變數引用多種不同類型的對象,從而實現代碼的復用和靈活性。多態性主要分為兩種類型:重載和重寫。
重載式多態,也稱為編譯時多態,指的是在同一類中方法的重載。通過不同的參數列表來區分不同的方法,編譯器在編譯時就能確定調用哪個方法。例如,一個類可以有多個同名的方法,但參數不同,編譯器會根據傳入的參數類型和數量自動選擇相應的方法調用。
重寫式多態,也稱為運行時多態或動態多態,指的是子類繼承父類後,重寫父類中的方法。在運行時,父類引用指向子類對象時,會根據實際的對象類型動態調用相應的方法。這種多態性是通過動態綁定(dynamic binding)實現的,即在執行期間根據實際對象類型調用方法,確保調用的是子類的特定實現。
實現多態性需要滿足三個條件:繼承、介面和方法重寫。當父類引用指向子類對象時,通過向上轉型(upcasting)可以訪問到子類繼承自父類的方法。然而,向上轉型丟失了子類特有的方法,因此,若想調用子類獨有的方法,需要進行向下轉型(downcasting)。
以下是一個簡單的示例,展示了多態性在Java中的應用。通過代碼,我們可以看到不同對象調用相同方法時的動態行為:
在示例中,我們創建了一個`Animal`類和兩個子類`Cat`和`Dog`。當使用父類引用調用`eat()`方法時,會根據實際對象類型調用相應的子類實現。向上轉型允許使用父類引用訪問子類對象,但會丟失子類特有的方法。向下轉型則可以通過強轉`cast`恢復子類特有的方法。最後,我們通過一個面試題進一步加深對多態性的理解,展示了向上轉型和向下轉型的用法以及它們各自的限制。
總的來說,多態性是Java中一種強大的特性,它允許我們編寫更加靈活、易於維護和擴展的代碼。通過合理利用多態,我們可以避免硬編碼特定對象類型,提高代碼的復用性和適應性。
⑵ java中重載,繼承,重寫和多態的區別
(1)方法重載是讓類以統一的方式處理不同類型數據的一種手段。多個同名函數同時存在,具有不同的參數個數/類型。重載Overloading是一個類中多態性的一種表現。
(2) Java的方法重載,就是在類中可以創建多個方法,它們具有相同的名字,但具
有不同的參數和不同的定義。調用方法時通過傳遞給它們的不同參數個數和參數類型
來決定具體使用哪個方法, 這就是多態性。
(3) 重載的時候,方法名要一樣,但是參數類型和個數不一樣,返回值類型可以相同也可以不相同。無法以返回型別作為重載函數的區分標准。
然後我們再來談談 重寫(Overriding)
(1)父類與子類之間的多態性,對父類的函數進行重新定義。如果在子類中定義某
方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要採用方法的重寫。方法重寫又稱方法覆蓋。
(2)若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數表,
則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關鍵字,該關鍵 字引用了當前類的父類。
(3)子類函數的訪問修飾許可權不能少於父類的;
⑶ JAVA中的多態與重載有什麼區別
多態性
通過繼承,一個類可以用作多種類型:可以用作它自己的類型、任何基類型,或者在實現介面時用作任何介面類型。這稱為多態性
重載
每個類型成員都有一個唯一的簽名。方法簽名由方法名稱和一個參數列表(方法的參數的順序和類型)組成。只要簽名不同,就可以在一種類型內定義具有相同名稱的多種方法。當定義兩種或多種具有相同名稱的方法時,就稱作重載。即重載時相同名稱成員的參數列表是不相同的(參數順序和類型)。
繼承,重寫和隱藏成員
派生的類型繼承其基本類型的所有成員;也就是說,這些成員是在派生類型之上定義的,並可用於派生類型。繼承成員的行為和質量可以通過以下兩種方式來修改:
1、派生類型可通過使用相同的簽名定義一個新成員,從而隱藏繼承的成員。將先前的公共成員變成私有成員,或者為標記為 final 的繼承方法定義新行為時,可以採取這種方法。
2、派生類型可以重寫繼承的虛方法。重寫方法提供了對方法的一種新定義,將根據運行時的值的類型,而不是編譯時已知的變數類型來調用方法。只有當虛方法沒有標記為 final 且新方法至少可以像虛方法一樣進行訪問的情況下,成員才能重寫虛方法。
方法名,參數相同形成重寫,重寫的方法不能降低原方法的"可見度",也不能改變原方法的返回值類型。
方法名相同,參數不同(個數、類型)形成重載,重載的方法可看成一個全新的方法,與原方法相比它可以有不同的"可見度"和「返回值類型」。如下例:
class A {
protected int method1(int a, int b) { return 0; }
}
public class B extends A{
public int method1(int a, int b) { return 0; } //正確,重寫父類方法,可以擴大訪問許可權
//private int method1(int a, int b) { return 0; } //錯誤,重寫父類方法,不能降低了訪問許可權
//private long method1(int a, int b) { return 0; } //錯誤,重寫父類方法,不能改變返回值類型
public short method1(int a, long b) { return 0; }//正確,重載自身的方法,可以有不同的訪問許可權和返回值類型
private int method1(int a, long b) { return 0; }//正確,重載自身的方法,可以有不同的訪問許可權和返回值類型
}
但這里 方法public short method1(int a, long b) { return 0; }和 方法private int method1(int a, long b) { return 0; }不能同時存在,因為在同一類中,不允許存在相同名字和參數類型的方法(重寫的方法)。
⑷ java里,方法重載是不是多態的一種實現
是。
什麼是多態:
1、面向對象的三大特性:封裝、繼承、多態。從一定角度來看,封裝和繼承幾乎都是為多態而准備的。這是最重要的知識點。
2、多態的定義:指允許不同類的對轎判散象對同一消息做出響應。即同一消息可以根據發送對象的不同而採用多種不同的行為方式。(發送消息就是函數調用)
3、實現多態的技術稱為:動態綁定(dynamic binding),是指在執行期間判斷所引用對象的實際類型,根據其實際的沖慧類型調用其相應的方法。
4、多態的作用:消除類型之閉氏間的耦合關系。
多態存在的三個必要條件:
一、要有繼承;
二、要有重寫或重載;
三、父類引用指向子類對象。
java實現多態的方式:
1、在同一類中多個同名函數同時存在,具有不同的參數個數/類型,實現重載
2、在繼承關系中,實現同名函數的重寫。子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數表,則新方法將覆蓋原有的方法