java重載覆蓋
Ⅰ 什麼是重載方法,什麼是覆蓋方法,主要區別
一、重載方法:方法重載是指在一個類中定義多個同名的方法,但要求每個方法具有不同的參數的類型或參數的個數。調用重載方法時,java編譯器能通過檢查調用的方法的參數類型和個數選擇一個恰當的方法。
方法重載通常用於創建完成一組任務相似但參數的類型或參數的個數或參數的順序不同的方法。Java的方法重載,就是在類中可以創建多個方法,它們可以有相同的名字,但必須具有不同的參數,即或者是參數的個數不同,或者是參數的類型不同。
調用方法時通過傳遞給它們的不同個數和類型的參數,以及傳入參數的順序來決定具體使用哪個方法
二、覆蓋方法:在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想做一定的修改,這就需要採用方法的重寫。方法重寫又稱方法覆蓋。
兩者的區別:
1、子類與父類的關系不同:覆蓋方法中的子類與父類之間是垂直關系;在重載方法中因為兩個方法在同一個類中,所以是不同方法之間的水平關系。
2、映射關系不同:覆蓋只能由一個方法,或只能由一對方法產生關系;在重載方法時,多個方法之間發生變化。
3、對於參數列表的需求不同:覆蓋要求參數列表相同;重載要求參數列表不同。
(1)java重載覆蓋擴展閱讀:
java的特點:
1、高性能
Java是一種先編譯後解釋的語言,所以它不如全編譯性語言快。但是有些情況下性能是很要緊的,為了支持這些情況,Java設計者製作了「及時」編譯程序,它能在運行時把Java位元組碼翻譯成特定CPU的機器代碼,也就是實現全編譯了。
Java位元組碼格式設計時考慮到這些「及時」編譯程序的需要,所以生成機器代碼的過程相當簡單,它能產生相當好的代碼。
2、多線索性
Java是多線索語言,它提供支持多線索的執行,能處理不同任務,使具有線索的程序設計很容易。Java的lang包提供一個Thread類,它支持開始線索、運行線索、停止線索和檢查線索狀態的方法。
Java的線索支持也包括一組同步原語。這些原語是基於監督程序和條件變數風范,由C.A.R.Haore開發的廣泛使用的同步化方案。用關鍵詞synchronized,程序員可以說明某些方法在一個類中不能並發地運行。這些方法在監督程序控制之下,確保變數維持在一個一致的狀態。
3、動態性
Java語言設計成適應於變化的環境,它是一個動態的語言。例如,Java中的類是根據需要載入的,甚至有些是通過網路獲取的。
參考資料來源:
網路-方法重載
網路-方法覆蓋
Ⅱ java中,什麼是重載和覆蓋,兩者有什麼區別
多態性 通過繼承,一個類可以用作多種類型:可以用作它自己的類型、任何基類型,或者在實現介面時用作任何介面類型。這稱為多態性 重載 每個類型成員都有一個唯一的簽名。方法簽名由方法名稱和一個參數列表(方法的參數的順序和類型)組成。只要簽名不同,就可以在一種類型內定義具有相同名稱的多種方法。當定義兩種或多種具有相同名稱的方法時,就稱作重載。即重載時相同名稱成員的參數列表是不相同的(參數順序和類型)。 繼承,重寫和隱藏成員 派生的類型繼承其基本類型的所有成員;也就是說,這些成員是在派生類型之上定義的,並可用於派生類型。繼承成員的行為和質量可以通過以下兩種方式來修改: 1、派生類型可通過使用相同的簽名定義一個新成員,從而隱藏繼承的成員。將先前的公共成員變成私有成員,或者為標記為 final 的繼承方法定義新行為時,可以採取這種方法。 2、派生類型可以重寫繼承的虛方法。重寫方法提供了對方法的一種新定義,將根據運行時的值的類型,而不是編譯時已知的變數類型來調用方法。只有當虛方法沒有標記為 final 且新方法至少可以像虛方法一樣進行訪問的情況下,成員才能重寫虛方法。
滿意請採納
Ⅲ java里的重寫,重載,覆蓋的區別
重寫即覆蓋,重載與覆蓋的區別是:
1)方法覆蓋要求參數簽名必須一致,而方法重載要求參數簽名必須不一致;
2)方法覆蓋要求返回類型必須一致,而方法重載對此不作要求
3)方法覆蓋只能用於子類覆蓋父類的方法,而方法重載用於同一個類中所有的方法(包括從父類中繼承過來的方法)
4)方法覆蓋對方法的訪問許可權和拋出的異常有特殊的要求,而方法重載對此無要求
5)父類的一個方法只能被子類覆蓋一次,而一個方法在所在的類中可以被重載多次
Ⅳ JAVA中方法重載和成員覆蓋是同一回事嗎
不是;大概如下幾點區別:
1、重載的方法發生在同一個類,而重寫覆蓋的方法發生在父類和子類之間
2、重載方法僅
形參
列表不同而已,調用時根據
實參
數據類型調用對應的方法;而重寫就方法體不一樣,訪問類修飾符也可以大於父類。
Ⅳ Java中方法的重載和覆蓋怎麼區分
重載(overload):發生在一個類的內部,而且是針對方法而不是域而言。若方法的簽名相同,但參數的個數或者參數的類型不同,則構成了重載。但返回類型不在考慮范圍之內,也就是說,如果僅僅是返回類型不同,則構不成重載。 覆蓋(override):發生在父類和子類之間,而且是針對實例方法(即非靜態方法)而不是域而言。構成覆蓋要滿足以下條件:1、父類中的static方法不可以被覆蓋;2、父類中的final方法不可以被覆蓋;3、方法的簽名、參數個數以及參數類型都要相同; 對於返回類型要說明兩點: 1)如果返回類型是引用類型,則覆蓋方法的返回類型可以聲明為父類方法聲明的返回類型的子類型; 2)如果返回類型是基本類型,則覆蓋方法的返回類型必須和父類方法的返回類型相同;來源:( http://blog.sina.com.cn/s/blog_5c4532e50100bqbl.html) - Java中的重載、覆蓋和隱藏_村長_新浪博客 對於方法參數的說明:不管父類方法中的參數是否是final的,子類都可以修改這個參數;4、子類方法的訪問許可權要大於等於父類的訪問許可權;5、子類方法可以改變某些方法修飾符,如:synchronized、native和strictfp。6、子類方法的throws子句可以和父類方法不同,它列出的每一個異常類型都應該和父類中的異常類型相同或者是父類異常類型的子類; 隱藏(hidden):發生在父類與子類之間,而且只是針對靜態成員(靜態方法和靜態域)。說明:被聲明為final的類方法不可以被隱藏。 實例方法被子類的方法覆蓋時,實際被調用的方法是在執行時決定的。類方法被子類的方法隱藏時,實際被調用的方法是在編譯時決定的。
Ⅵ java語言中,overload(重載)和override(覆蓋)有何區別
方法的重寫(Overriding)和重載(Overloading)是Java多態性的不同表現。重寫(Overriding)是父類與子類之間多態性的一種表現,而重載(Overloading)是一個類中多態性的一種表現。
如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫
(Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被"屏蔽"了。
如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型或有不同的參數次序,則稱為方法的重載(Overloading)。不能通過訪問許可權、返回類型、拋出的異常進行重載.
Ⅶ java中方法覆蓋和方法重載是什麼意思
Java中覆蓋和重載的區別如下:
override 可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個方法並且對其重寫,以求達到不同的作用。最熟悉的覆蓋就是對介面方法的實現,在介面中一般只是對方法進行了聲明,而在實現時,就需要實現介面聲明的所有方法。除了這個典型的用法以外,在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋要注意以下的幾點:
1、覆蓋的方法的標志必須要和被覆蓋的方法的標志完全匹配,才能達到覆蓋的效果;
2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。
overload對來說可能比較熟悉,可以翻譯為重載,它是指可以定義一些名稱相同的方法,通過定義不同的輸入參數來區分這些方法,然後再調用時,VM就會根據不同的參數樣式,來選擇合適的方法執行。在使用重載要注意以下的幾點:
1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是fun(int, float), 但是不能為fun(int, int));
2、不能通過訪問許可權、返回類型、拋出的異常進行重載;
3、方法的異常類型和數目不會對重載造成影響;
4、對於繼承來說,如果某一方法在父類中是訪問許可權是priavte,那麼就不能在子類對其進行重載,如果定義的話,也只是定義了一個新方法,而不會達到重載的效果。
下面是對override和overload的測試程序,其中注釋中的內容都是會產生編譯錯誤的代碼,將注釋去掉,看看在編譯時會產生什麼效果。
// 對overload測試的文件:OverloadTest.java
public class OverloadTest {
// 下面幾個方法用來驗證可以通過定義不同的參數類型和參數的數目進行方法重載。
public void fun(){
System.out.println("method fun in OverloadTest, no parameter");
}
public void fun(float f) {
System.out.println("method fun in OverloadTest, parameter type: float");
}
public void fun(int i){
System.out.println("method fun in OverloadTest, parameter type: int");
}
public void fun(int i1, int i2) {
System.out.println("method fun in OverloadTest, parameter type: int, int");
}
// 下面的兩個方法用來驗證可以通過定義不同的參數順序進行方法重載。
// 需要注意:這里的參數肯定不是相同的類型,否則的順序的先後就毫無意義。
public void fun1(int i, float f) {
System.out.println("method fun1 in OverloadTest, sequence of parameters is: int, float");
}
public void fun1(float f, int i) {
System.out.println("method fun1 in OverloadTest, sequence of parameters is: float, int");
}
// 下面的兩個方法用來驗證方法拋出的異常對於重載的影響.
// 無論是異常的類型還是異常的個數都不會對重載造成任何的影響。
public void fun2() throws TestException {
System.out.println("fun2 in OverloadTest, exception: TestException");
}
public void fun2(int i) throws TestException, TestException1 {
System.out.println("fun2 in OverloadTest, exception: TestException, TestException1");
}
public void fun2(float f) throws Exception {
System.out.println("fun2 in OverloadTest, exception: Exception");
}
// 不能通過拋出的異常類型來重載fun方法。
//public void fun(int i) throws Exception {
// System.out.println("method fun in OverloadTest, parameter type: int, exception: Exception");
//}
// 不能通過返回值重載fun方法。
//public boolean fun(int i) throws Exception {
// System.out.println("method fun in OverloadTest, parameter type: int, exception: Exception, return: boolean");
// return true;
//}
private void fun3() { }
// 不能通過不同的訪問許可權進行重載
public void fun3() { }
public static void main(String[] args) {
// 這里只是定義了OverloadTest的實例,所以test不會調用
// OverloadTest1中的方法。
OverloadTest test = new OverloadTest1();
// 這里定義了OverloadTest1的實例,因為OverloadTest1是OverloadTest
// 的子類,所以test1會調用OverloadTest中的方法。
OverloadTest1 test1 = new OverloadTest1();
try {
int i = 1, j = 2, m = 3;
// 這里不會調用OverloadTest1的fun方法
// test.fun(i, m, j);
test1.fun(i, j, m);
test1.fun();
// 這個調用不會執行,因為fun3()在OverloadTest中訪問許可權是priavte
//test1.fun3();
test1.fun3(i);
} catch(Exception e) { }
}
}
class OverloadTest1 extends OverloadTest{
// 在子類中重載fun
public void fun(int i, int m, int n) {
System.out.println("Overload fun1 in OverloadTest1, parameter type: int, int, int");
}
// 這個不是對父類中方法的重載,只是一個新的方法。
public void fun3(int i) {
System.out.println("fun2 in OverloadTest1");
}
}
// 對override測試的文件:OverrideTest.java
public class OverrideTest {
public void fun() throws TestException {
System.out.println("method fun in OverrideTest");
}
private void fun1() {
System.out.println("method fun1 in OverrideTest");
}
public static void main(String[] args) {
OverrideTest test = new OverrideTest1();
try {
test.fun();
test.fun1();
} catch(Exception e) { }
}
}
class OverrideTest1 extends OverrideTest{
// 以下正常Override
public void fun() throws TestException2 {
System.out.println("fun in OverrideTest1");
}
// 不能Override父類中的方法,因為它定義了不同的異常類型和
// 返回值。
//public int fun() throws TestException1 {
// System.out.println("method fun in Test");
// return 1;
//}
// 不能Override父類中的方法,因為它拋出了比父類中非法范圍
// 更大的異常。
//public void fun() throws Exception {
// System.out.println("fun in OverrideTest1");
//}
// 這個方法並沒有Override父類中的fun1方法,因為這個方法在
// 父類是private類型,所以這里只是相當於定義了一個新方法。
public void fun1() {
System.out.println("method fun1 in Test");
}
}
class TestException extends Exception{
public TestException(String msg) {
super(msg);
}
}
class TestException1 extends TestException {
public TestException1(String msg) {
super(msg);
}
}
class TestException2 extends TestException {
public TestException2(String msg) {
super(msg);
}
}
Ⅷ java中方法的覆蓋及重載是什麼意思
覆蓋是override方法重寫
重載是overload
按照教科書上的定義,重載就是具有相同函數名,返回類型可以不同,參數個數、順序、類型不同的函數。我的理解是重載是發生在兩個或者是更多的函數具有相同的名字的情況下。
重寫就是覆蓋父類的方法,和父類有相同返回類型,參數,甚至是拋出的異常,重寫方法不能為private,運用中最典型的就是對介面方法的覆蓋。
Ⅸ java中重載,覆蓋和隱藏的區別
重載是發生在同一個類中,許多名稱相同而簽名不同或返回類型不同的方法。簽名指的是方法的參數類型,參數個數等。比如在某個類中,有一個CreateStudent(int no,string name) 方法。現在我再寫一個包含三個參數,名稱也叫CreateStudent的方法CreateStudent(int no,string name,string sex)那麼我現在寫的這個方法(三個參數)就是剛剛那個方法(兩個參數)的重載。當然不一定非得參數個數不同,參數類型不同或者返回類型不同也都是可以的,但是名稱必須相同。
而覆蓋,又叫重寫,是發生在子類中,來覆蓋(重寫)父類的方法。注意子類中的方法名稱和簽名跟父類是一模一樣的,返回值也與父類相同或是父類的子類。比如我現在有一個類B繼承父類A。Class B extends A 在A類中有一個方法int Math(int a,int b){return a+b;} 現在我在子類B中也寫一個跟父類A返回類型、名稱、簽名都一樣的方法 int Math(int a,int b){return a-b;} 現在我創建一個B的實例 B b = new B(); 調用Math方法 b.Math,此時b調用的方法是 子類中的a-b 而不是父類中的a+b 因為子類的方法把父類覆蓋了。換句話說也就是子類重寫了父類的 int Math方法。
Ⅹ java中重載和覆蓋的區別
方法覆蓋是父子類之間多態性的一種體現:覆蓋涉及到兩個不同的方法,一個父類的方法,另一個則是子類中的方法,兩個方法具有相同的函數名和方法簽名。
方法重載是一個類中多態性的一種體現:重載需要保證兩個方法具有相同的函數名和不同的方法簽名
方法簽名:指的是函數方法名稱和參數列表(方法參數順序,類型)。