java 不同包子类 覆盖_Java中不同方法的覆盖方法
經(jīng)過(guò)測(cè)試
覆蓋的好處是能夠定義特定于子類類型的行為,這意味著子類可以根據(jù)其要求實(shí)現(xiàn)父類方法。
用面向?qū)ο蟮男g(shù)語(yǔ)來(lái)說(shuō),覆蓋是指覆蓋現(xiàn)有方法的功能。
示例class?Animal?{
public?void?move()?{
System.out.println("Animals?can?move");
}
}
class?Dog?extends?Animal?{
public?void?move()?{
System.out.println("Dogs?can?walk?and?run");
}
}
public?class?TestDog?{
public?static?void?main(String?args[])?{
Animal?a?=?new?Animal();?//?Animal?reference?and?object
Animal?b?=?new?Dog();?//?Animal?reference?but?Dog?object
a.move();?//?runs?the?method?in?Animal?class
b.move();?//?runs?the?method?in?Dog?class
}
}
輸出結(jié)果Animals?can?move
Dogs?can?walk?and?run
在上面的示例中,您可以看到,即使b是Animal的一種,它也會(huì)在Dog類中運(yùn)行move方法。原因是:在編譯時(shí),對(duì)引用類型進(jìn)行檢查。但是,在運(yùn)行時(shí)中,JVM會(huì)找出對(duì)象類型并運(yùn)行屬于該特定對(duì)象的方法。
因此,在上面的示例中,由于Animal類具有方法move,因此程序?qū)⒄_編譯。然后,在運(yùn)行時(shí),它將運(yùn)行特定于該對(duì)象的方法。
示例class?Animal?{
public?void?move()?{
System.out.println("Animals?can?move");
}
}
class?Dog?extends?Animal?{
public?void?move()?{
System.out.println("Dogs?can?walk?and?run");
}
public?void?bark()?{
System.out.println("Dogs?can?bark");
}
}
public?class?TestDog?{
public?static?void?main(String?args[])?{
Animal?a?=?new?Animal();?//?Animal?reference?and?object
Animal?b?=?new?Dog();?//?Animal?reference?but?Dog?object
a.move();?//?runs?the?method?in?Animal?class
b.move();?//?runs?the?method?in?Dog?class
b.bark();
}
}
輸出結(jié)果TestDog.java:26:?error:?cannot?find?symbol
b.bark();
^
symbol:?method?bark()location:?variable?b?of?type?Animal
1?error
由于b的引用類型Animal沒(méi)有樹(shù)皮名稱的方法,因此該程序?qū)⒁l(fā)編譯時(shí)錯(cuò)誤。
方法覆蓋規(guī)則參數(shù)列表應(yīng)與重寫方法的列表完全相同。
返回類型應(yīng)該與超類中原始重寫方法中聲明的返回類型相同或?yàn)樵撟宇愋偷淖宇愋汀?/p>
訪問(wèn)級(jí)別不能比重寫方法的訪問(wèn)級(jí)別更嚴(yán)格。例如:如果將超類方法聲明為public,則子類中的覆蓋方法不能為private或protected。
實(shí)例方法只有在子類繼承的情況下才能被覆蓋。
聲明為final的方法不能被覆蓋。
聲明為static的方法不能被覆蓋,但可以重新聲明。
如果無(wú)法繼承方法,則無(wú)法覆蓋該方法。
與實(shí)例的超類相同的包中的子類可以覆蓋未聲明為私有或最終的任何超類方法。
不同包中的子類只能覆蓋聲明為public或protected的非最終方法。
無(wú)論重寫方法是否引發(fā)異常,重寫方法都可以引發(fā)任何uncheck異常。但是,重載方法不應(yīng)拋出比被重載方法聲明的異常新的或更廣泛的檢查異常。與重寫方法相比,重寫方法可以引發(fā)更窄或更少的異常。
構(gòu)造函數(shù)不能被覆蓋。
使用超級(jí)關(guān)鍵字
調(diào)用覆蓋方法的超類版本時(shí),將使用super關(guān)鍵字。
示例class?Animal?{
public?void?move()?{
System.out.println("Animals?can?move");
}
}
class?Dog?extends?Animal?{
public?void?move()?{
super.move();?//?invokes?the?super?class?method
System.out.println("Dogs?can?walk?and?run");
}
}
public?class?TestDog?{
public?static?void?main(String?args[])?{
Animal?b?=?new?Dog();?//?Animal?reference?but?Dog?object
b.move();?//?runs?the?method?in?Dog?class
}
}
輸出結(jié)果Animals?can?move
Dogs?can?walk?and?run
測(cè)試
總結(jié)
以上是生活随笔為你收集整理的java 不同包子类 覆盖_Java中不同方法的覆盖方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java 程序分析题_java程序入门5
- 下一篇: java web技术及应用_Java W