這個(gè)知識(shí)點(diǎn)你會(huì)弄錯(cuò)固逗。
重寫:兩個(gè)方法有相同的名稱和相同的參數(shù)彬坏,其中一個(gè)方法位于子類挟鸠,另一個(gè)方法位于這個(gè)子類的父類中嘉赎。重寫讓子類可以在父類的基礎(chǔ)上實(shí)現(xiàn)跟你更多的功能置媳,或者實(shí)現(xiàn)自己的功能。
多說兩句公条,重寫是針對(duì)方法的拇囊,針對(duì)成員變量的重寫有試過嗎?
案例
看一下下面的代碼靶橱,猜一下運(yùn)行的結(jié)果是什么寥袭。
class Super {
String s = "老子";
public String bark(){
return s;
}
}
class Sub extends Super {
String s = "兒子";
@Override
public String bark() {
return s;
}
}
public class FieldOverriding {
public static void main(String[] args) {
Sub c1 = new Sub();
System.out.println(c1.s);
System.out.println(c1.bark());
Super c2 = new Sub();
System.out.println(c2.s);
System.out.println(c2.bark());
}
}
定義:在一個(gè)類中,成員變量的名稱和父類相同的時(shí)候會(huì)隱藏父類的成員比那里关霸,盡管類型不同传黄。在子類中,父類的成員變量不能通過變量名字來引用队寇。只能膘掰,通過它的父類來訪問。
最后:我們不建議這么做佳遣,這樣會(huì)讓代碼閱讀變得困難识埋。
運(yùn)行結(jié)果:
兒子 // c1.s
兒子 // c1.bark()
老子 // c2.s
兒子 // c2.bark
分析
c1和c2是相同的對(duì)象,也就是相同的class零渐,但是c2.s為父類的內(nèi)容窒舟,意味著父類和子類的成員變量都是存在的。
我們也可以這樣訪問:
((Super) c2).s //注意這里的Super不是Java的關(guān)鍵字相恃。
額外
重寫和重載都會(huì)放在一起唄提到辜纲,初學(xué)者也經(jīng)常弄混淆兩者的概念。
重載:兩個(gè)或更多個(gè)有相同的名稱拦耐,但是有不同的參數(shù)耕腾。(參數(shù)個(gè)數(shù)不同,參數(shù)類型不同),與方法的返回值無關(guān)杀糯,與權(quán)限修飾符無關(guān)扫俺。類型,個(gè)數(shù)固翰,順序
最后
這個(gè)概念在Java的官方文檔中有提到狼纬,想把Java搞明白羹呵,還是要閱讀官方文檔,最一手的資料疗琉。
有沒有覺得這個(gè)知識(shí)點(diǎn)很偏呢...
下面這個(gè)程序運(yùn)行結(jié)果是什么冈欢?
public class Base
{
private String baseName = "base";
public Base()
{
callName();
}
public void callName()
{
System. out. println(baseName);
}
static class Sub extends Base
{
private String baseName = "sub";
@Override
public void callName()
{
System. out. println (baseName) ;
}
}
public static void main(String[] args)
{
Base b = new Sub();
}
}
答案解析:
new Sub();在創(chuàng)造派生類的過程中首先創(chuàng)建基類對(duì)象,然后才能創(chuàng)建派生類盈简。
創(chuàng)建基類即默認(rèn)調(diào)用Base()方法凑耻,在方法中調(diào)用callName()方法,由于派生類中存在此方法柠贤,則被調(diào)用的callName()方法是派生類中的方法香浩,此時(shí)派生類還未構(gòu)造,所以變量baseName的值為null