??引言??
大家好,我是執梗,我致力于寫從Java基礎開始向JavaEE進階的Java知識,也會涉及到一些演算法知識,有興趣的伙伴可以一起關注交流,歡迎閱讀我的JavaSE基礎系列,今天為了大家講解Java基礎中比較重要的知識點——多載和重寫,至于為什么要把它們兩個放一起呢,因為很多人剛學總是傻傻分不清哈哈哈,其實它們的本質沒多大關系,
📒博客首頁:執梗的博客
🎉歡迎關注🔎點贊👍收藏??留言📝
?? :熱愛Java學習,期待一起交流!
🙏作者水平很有限,如果發現錯誤,求告知,多謝!
🌺有問題可私信交流!!!
??小劇場??
下列關于多載和重寫的說法,錯誤的是?(多選)
A.多載就是一個類中,有多個方法名相同、但引數串列和回傳值不同的方法,
B. 子類重寫父類的方法時,方法權限必須保證和父類相同
C.不同的構造方法體現的正是多載的思想
D.當子類繼承父類后,只有靜態方法是不可以重寫的
??知識導航??
??、引言??
??小劇場??
??1.什么是方法多載?
??2.多載的注意事項?
🌿1.多載和方法的回傳值無關
🌿2.多載和方法的引數名無關
🌿3.構造方法是多載思想的體現
🌿4.final和static修飾的方法仍然可以多載
??3.什么是方法重寫?
??4.方法重寫(覆寫)的記憶口訣:兩同兩小一大
🌰1.什么是兩同?
🌰2.什么是兩小?
🌰3.什么是一大?
??5.方法重寫(覆寫)的注意事項
🌕1.private修飾的方法不可被重寫
🌕1.static修飾的方法不可被重寫
??6.如何區分多載和重寫?
??小劇場解答??
??1.什么是方法多載?
在Java語言中,在同一個類中,存在多個方法名相同,但是具有不同的引數串列,這就稱之為方法多載(method overloading),這里的引數串列,指的就是方法的引數,只要其中的引數型別、引數個數、引數順序不用我們就可以認為是引數串列不同,
舉一個Demo類栗子
public class Demo {
//一個不帶引數沒有回傳值的test方法
public void test(){
}
//一個不帶回傳值,引數為int型別的test方法
public void test(int a){
System.out.println(a);
}
//一個回傳值為int,引數為int、String的test方法
public int test(int a,String b){
System.out.println(a+b);
return a;
}
}
🔑 :通過上面的栗子我們很清楚,更印證了我們只要方法名相同,引數串列不同即是方法多載,但是為什么是這樣呢?很多人只是生硬的記憶,卻沒有思考過這個問題,很多文章也沒有說明,其實我們的代碼寫好以后,它是交給我們的JVM去編譯的,當你在一個地方呼叫了一個多載方法時,它當然一開始并不知道你的這個方法是哪一個,但是通過你的引數串列的不同它就可以找到你想呼叫的方法,
??2.多載的注意事項?
🌿1.多載和方法的回傳值無關
之所以多次強調這一點,是因為這是方法多載最容易掉坑犯錯的地方,其實我們認真想一下就能記住,我們要方法引數串列不一致,是為了能讓JVM區分我們使用的是哪個方法,那如果我寫了兩個引數串列一樣的同名方法,但回傳值不同,JVM能識別嗎?當然不能,因為我們呼叫方法時只需要寫方法名和引數串列,并沒有寫回傳值,JVM當然不能識別你是哪個方法,所以千萬記住多載和方法的回傳值無關
🌿2.多載和方法的引數名無關
再次強調一遍,引數直接不同指的是引數型別,引數個數、引數順序三者有一個不同即可,和引數的名稱毫無關系,比如你寫了兩個方法test(int a)和test(int b),請問我們在傳引數時要考慮引數名嗎?當然不考慮,我們考慮的是引數型別,我傳個int a,b,c,d,e,f,g都是符合兩個方法的,這時你JVM根本分不出我要用的是哪個方法,所以別人問你的時候一定要聽清,做題也要細心點,多載和方法的引數名是無關的
🌿3.構造方法是多載思想的體現
有些初學者,在對多載理解不透徹時,總在想構造方法是不是多載方法,這個問題當然是肯定的,首先明確多載的定義就清楚了,1、在一個類中2、方法名相同3、引數串列不同,構造方法是條條都符合,我們經常說什么無參構造一參構造等等,正是體現地引數串列不同,所以記住,構造方法正是我們多載思想最重要的體現
🌿4.final和static修飾的方法仍然可以多載
我發現很多的文章都說被final和static修飾的方法是不可被多載的,這其實是誤人子弟,大家手動嘗試一下就知道,可以發現編譯器并沒有報錯,但其實認真想想,多載的三定義并沒有要求方法是非final和非靜態的,所以在學習的程序還是要手動自己去實踐,永遠根據多載的定義去判斷,就不會錯,
public abstract class Demo {
//靜態方法可以多載,未報錯
public static void testA(){}
public void testA(int a){}
//final方法也可以多載,未報錯
public final void testB(){}
public void testB(int b){}
//抽象方法仍然可以多載
public abstract void testC();
public void testC(int C) {}
}
??3.什么是方法重寫?
在面向物件的繼承中,我們都知道,當子類繼承父類后,會獲得我們父類中的成員屬性和成員方法,但當我們在應用時,發現父類的方法并不適合用我們的子類,在我們不改變方法名和引數串列時我們可以對父類的方法里的內容進行重寫書寫,這就是方法重寫,
舉一個重寫的例子
public class Demo1 {
int a;
public void test(){
System.out.println("我是Demo1");
}
}
class Demo2 extends Demo1 {
@Override
public void test(){
System.out.println("我是Demo2");
}
}
🔑:里面就是一個父類Demo1和子類Demo2,我們發現子類的test方法和父類test方法除了方法體內幾乎是一模一樣的,但我們只需要先暫時記住保證方法名和引數串列一致(悄悄和多載對比一下),在方法體內他們是不同的,這就是一個方法重寫,子類Demo2繼承了父類的test()方法,但是重新書寫了其中的內容,我們發現子類的test方法頭上有一個@Override,這其實是一個注解(可能還沒學習,但是不影響使用),當我們在子類重寫方法時,在頭上加一個@Override發現沒有報錯,就說明你的重寫是正確的,@Override是一個我們判斷是否方法重寫是否成功且是否合理的注解,當不正確時它會報錯,
??4.方法重寫(覆寫)的記憶口訣:兩同兩小一大
🌰1.什么是兩同?
兩同指的是在方法重寫中,子類的方法和父類的方法的方法名和引數串列(引數個數、引數順序、引數型別)必須相同
🌰2.什么是兩小?
我們在兩同判斷的基礎上,還需要判斷兩小,第一個小是回傳值型別,子類重寫方法的回傳值型別必須小于等于父類方法的回傳值型別,什么意思呢?就是你子類的回傳值型別得是我父類回傳型別的子類,最多也只能和我相等,比如我父類回傳值型別是上文中的Demo1,那你子類回傳值型別得是我Demo1的子類,當然和父類參考同樣是Demo1也可以,另一小指的是,如果方法中有例外拋出,子類拋出的例外也得小于或等于父類拋出的例外,其實這個意思和上面相同,在Java中例外也是物件,用類來表示且有著繼承的關系,也就是你子類拋出的例外必須小于等于父類拋出的例外,也就是子類拋出例外同樣得是父類拋出例外的子類,也可以一致,
🌰3.什么是一大?
既然是方法,那肯定有訪問權限,我們規定:子類的重寫方法權限必須大于或等于父類的訪問權限,按照pubic>protected>default(默認)>protect這個進行排序進行選擇,比如父類為public時,子類不能為protected或default,只能也為public,如果父類為protected,那子類必須為public或protectde
??5.方法重寫(覆寫)的注意事項
🌕1.private修飾的方法不可被重寫
其實這個很容易解釋,private是私有的屬性,其他類是不可訪問,子類從父類是無法繼承到private權限的方法的,更別提重寫了,而且,在Java中,所有的privat方法都是默認為final的,這點很少有人知道,final方法是無法被重寫的,結合起來,所以大家一定要記住,子類并不一定能重寫父類所有的方法,private的方法是不可被重寫的,
🌕1.static修飾的方法不可被重寫
其實就是靜態方法是不可被重寫的,這個是固有的要求,如果真要說原因,就涉及到靜態的概念了,我們的方法重寫是基于運行時態系結,但靜態資源在編譯時就已經靜態系結了,所以我們無法重寫,不理解也沒關系能記住就好,靜態方法無法被重寫(覆寫),這也能證明子類并不能繼承父類所有的方法這句話,


@Override報錯了說明不符合要求
??6.如何區分多載和重寫?
其實如果能閱讀玩我這篇文章,就能真正感受到,其實區別還是很大的,但是多載和重寫都體現除了Java語言中的多型性質,多載是對一個類中的多個同名方法進行判斷,而重寫時基于父類和子類的同名方法來判斷 ,一個是在一個類中,一個是在兩個類中,如果有人說自己無法區分多載和重寫,那就是他對這兩者的本質沒有真正的了解,或者說他根本就沒有去了解,Java基礎性的知識一定要自己去嘗試去思考去理解,這樣才利于后續階段的學習
??小劇場解答??
答案:ABD
A. 多載與回傳值無關
B.不一定要相同,子類權限大于父類也行
C.正確
D.static方法和private都不可以被重寫
我是執梗,如果文章有錯誤請及時指教,有問題也可以討論,覺得有用的話麻煩三連,多謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/375866.html
標籤:java
