寫(xiě)在前面
小弟最近再惡補(bǔ)java基礎(chǔ)越看越有意思,覺(jué)得java邏輯清晰蒿柳、設(shè)計(jì)優(yōu)雅酷师、內(nèi)存管理堪稱(chēng)藝術(shù),看來(lái)光頭的程序員還是比較厲害畏浆。在學(xué)習(xí)的過(guò)程中遇到了一個(gè)小面試題既是標(biāo)題《方法的重載與重寫(xiě)的區(qū)別》本篇就從定義/語(yǔ)法和內(nèi)存執(zhí)行方面來(lái)說(shuō)說(shuō)我對(duì)于這兩類(lèi)方法定義的看法税稼,codeman奉上烦秩!
重載-定義
- 在同一個(gè)類(lèi)中兩個(gè)方法的方法名相同,形參列表
不同
就構(gòu)成了方法的重載郎仆。
public class Person{
public void sport(int age, String name){
System.out.println("我是原方法");
}
public void sport(String name, int age){
System.out.println("我被重載了");
}
}
- 不同的含義
形參類(lèi)型只祠、形參個(gè)數(shù)、形參順序不同 - 只有返回值不同不構(gòu)成方法的重載
如:int a(String str){}與void a(String str){}不構(gòu)成方法重載 - 只有形參的名稱(chēng)不同扰肌,不構(gòu)成方法的重載
如:int a(String str){}與int a(String s){}不構(gòu)成方法重載
重載-內(nèi)存加載
public class Test{
public static void main(String [] args){
Person person = new Person();
person.sport("老屈", 28) // 我被重載了
}
}
重載-總結(jié)
在具象出對(duì)象之后進(jìn)行方法調(diào)用時(shí)會(huì)依據(jù)實(shí)參和形參對(duì)應(yīng)找出一個(gè)最合適的方法入棧,在滿(mǎn)足了重載規(guī)則的前提匹配規(guī)則如下:
- 依據(jù)形參的類(lèi)型字節(jié)大小進(jìn)行排序(byte-1,short-2,char-2,int-4,long-8,float-4,double-8)
例如:
public class Person{
public void sport(int age){
System.out.println("重載1");
}
public void sport(short age){
System.out.println("重載2");
}
public void main(String[] args){
Person person = new Person();
person.sport(1);
}
}
以上情況會(huì)優(yōu)先調(diào)用重載2,因?yàn)閟hort字節(jié)數(shù)更少.
- 如果形參的類(lèi)型字節(jié)數(shù)相同,就會(huì)直接匹配形參的類(lèi)型
例如:
public class Person{
public void sport(double age){
System.out.println("重載1");
}
public void sport(long age){
System.out.println("重載2");
}
public void main(String[] args){
Person person = new Person();
person.sport(1.0);
}
}
以上情況會(huì)調(diào)用重載1,如果實(shí)參變?yōu)?1 那么就會(huì)調(diào)用重載2
重寫(xiě)-定義
- 在子類(lèi)中定義與父類(lèi)中相同方法名/形參列表的方法構(gòu)成類(lèi)方法重寫(xiě)
public class Primate {
public void eat(String food, double weight){
System.out.println("父類(lèi)方法");
}
}
public class Person extends Primate{
public void eat(String food, double weight) {
System.out.println("子類(lèi)方法");
}
}
- 方法重寫(xiě)構(gòu)成的嚴(yán)格條件:子類(lèi)的方法名字和父類(lèi)必須一致,參數(shù)列表(個(gè)數(shù)抛寝,類(lèi)型,順序)也要和父類(lèi)一致狡耻。
重寫(xiě)-內(nèi)存加載
public class Test{
public static void main(String [] args){
Person person = new Person();
person.eat("香蕉", 2.8) //子類(lèi)方法
}
}
- 優(yōu)先進(jìn)棧子類(lèi)重寫(xiě)的方法
重寫(xiě)-補(bǔ)充要求
- 補(bǔ)充的兩點(diǎn)要求是要為面向?qū)ο笕筇卣髦械亩鄳B(tài)做保證
父類(lèi)的返回值類(lèi)型要是子類(lèi)返回值類(lèi)型的父類(lèi)
父類(lèi)權(quán)限修飾符要小于子類(lèi)權(quán)限修飾符
有時(shí)候父類(lèi)需要向下轉(zhuǎn)型引用子類(lèi)的方法實(shí)現(xiàn)多態(tài), 那么父類(lèi)的返回值如果是子類(lèi)的返回值類(lèi)型的子類(lèi)那么父類(lèi)是接不住子類(lèi)的返回值的(父類(lèi)大于子類(lèi)自動(dòng)向上轉(zhuǎn)型)墩剖。同樣的如果父類(lèi)方法的修飾符為public子類(lèi)方法的修飾符為private,在父類(lèi)調(diào)用子類(lèi)方法時(shí)候會(huì)報(bào)錯(cuò)因?yàn)樽宇?lèi)方法私有,那么此次操作也是不成立
方法的重寫(xiě)與重載的區(qū)別點(diǎn)
這里整理了一份表格從六個(gè)維度顯示兩種定義類(lèi)型的區(qū)別
寫(xiě)在后面
我抄的些定義放到文章里隨時(shí)能過(guò)來(lái)看到.就喜歡這些有規(guī)則的東西,不管世界怎么變你遵守規(guī)則就永遠(yuǎn)錯(cuò)不了.不過(guò)這里不建議死記硬背可以多去理解他的規(guī)則為什么這么定義夷狰,這樣做一來(lái)可以接觸到關(guān)聯(lián)的知識(shí)二來(lái)還可以加深對(duì)他的理解。理解遠(yuǎn)比背下來(lái)要高效的多.以上就是按老屈的理解記了記還是希望大哥們看到錯(cuò)誤能留下意見(jiàn)=荐沼头!