JavaSE-面向?qū)ο?方法重寫(xiě))
方法重寫(xiě)與之前的方法重載不同
回顧一下方法重載,相同的方法名不同參數(shù)類(lèi)型和參數(shù)數(shù)量以及參數(shù)順序
package Demo1; import java.util.Arrays; public class Demo011 { public static void main(String[] args) { Demo011 D11=new Demo011(); D11.demo(12,232,43,3); //4個(gè)實(shí)際參數(shù),則調(diào)用第三個(gè)demo方法 } public void demo(int a,int b){ System.out.println(a+b); } public void demo(int a,int b,int c){ System.out.println(a+b+c); } public void demo(int...ints){ System.out.println(Arrays.toString(ints)); } }
方法重寫(xiě)
重寫(xiě)都是方法的重寫(xiě)與屬性無(wú)關(guān)
package Demo1; public class Demo012 { public static void main(String[] args) { B b =new B(); b.demo(); } } class A{ public static void demo(){ System.out.println("Ademo"); } } class B extends A{ public static void demo(){ System.out.println("Bdemo"); } }
執(zhí)行結(jié)果:
Bdemo
父類(lèi)的引用指向子類(lèi)進(jìn)行引用
public static void main(String[] args) { //方法的調(diào)用只和數(shù)據(jù)類(lèi)型有關(guān) B b =new B(); //調(diào)用的是B類(lèi)的靜態(tài)方法 b.demo(); //父類(lèi)的引用指向子類(lèi) A a = new A(); //調(diào)用的是A類(lèi)的靜態(tài)方法 a.demo(); }
執(zhí)行結(jié)果:
Bdemo
Ademo
使用快捷鍵Alt+insert快速生成重寫(xiě)方法
Override重寫(xiě)方法
class A{ public void demo(){ System.out.println("Ademo"); } } class B extends A{ @Override //注解,有功能的注釋 public void demo() { super.demo(); //默認(rèn)調(diào)用父類(lèi)的demo()方法 } }
使用Override重寫(xiě)默認(rèn)是調(diào)用父類(lèi)的方法,我們可以在重寫(xiě)方法中調(diào)用自己的方法
class A{ public void demo(){ System.out.println("Ademo"); } } class B extends A{ @Override public void demo() { //super.demo(); 默認(rèn)調(diào)用父類(lèi)的demo()方法輸出Ademo System.out.println("Bdemo"); } }
重寫(xiě)之后執(zhí)行結(jié)果:
Bdemo
Bdemo
子類(lèi)重寫(xiě)父類(lèi)的demo()方法之后輸出為demoB,但是并不是子類(lèi)重寫(xiě)之后將父類(lèi)的方法修改了,子類(lèi)在進(jìn)行調(diào)用的時(shí)候調(diào)用的是重寫(xiě)后父類(lèi)的方法
package Demo3; public class demo005 { public static void main(String[] args) { DemoB DB =new DemoB(); DB.demo(); //調(diào)用子類(lèi)的demo DemoA DA=new DemoA(); //調(diào)用父類(lèi)的demo DA.demo(); } } class DemoA{ public void demo(){ System.out.println("demoA"); } } class DemoB extends DemoA{ //繼承 @Override public void demo(){ System.out.println("demoB"); } }
執(zhí)行結(jié)果:
demoB
demoA
但是我可以完全不繼承父類(lèi)也能輸出demoB,demoA
package Demo3; public class demo005 { public static void main(String[] args) { DemoB DB =new DemoB(); DB.demo(); DemoA DA=new DemoA(); DA.demo(); } } class DemoA{ public void demo(){ System.out.println("demoA"); } } class DemoB{ //A與B沒(méi)有繼承關(guān)系 public void demo(){ System.out.println("demoB"); } }
執(zhí)行結(jié)果:
demoB
demoA
兩種方式有什么區(qū)別呢?
- 子類(lèi)繼承父類(lèi)重寫(xiě)方法,是通過(guò)子類(lèi)調(diào)用父類(lèi)的方法進(jìn)行重寫(xiě)的,子類(lèi)執(zhí)行結(jié)果也是重寫(xiě)后的方法,但并不是子類(lèi)把父類(lèi)的方法修改了
- 方式二是在兩個(gè)不同類(lèi)下創(chuàng)建demo()方法,通過(guò)對(duì)象進(jìn)行調(diào)用。
父類(lèi)方法若添加static修飾符則重寫(xiě)失敗提示錯(cuò)誤
進(jìn)行方法重寫(xiě)時(shí)靜態(tài)方法和非靜態(tài)方法的區(qū)別很大,如果是加了static靜態(tài)方法,調(diào)用結(jié)果之和左邊定義的類(lèi)有關(guān)。方法重寫(xiě)與非靜態(tài)方法有關(guān)
私有方法無(wú)法進(jìn)行方法重寫(xiě),重寫(xiě)的關(guān)鍵詞只能是public不能是private私有的
重寫(xiě)小結(jié):
- 方法重寫(xiě)需要有繼承關(guān)系,子類(lèi)重寫(xiě)父類(lèi)的方法
- 子類(lèi)方法與父類(lèi)的方法方法名和修飾符必須相同
- 以及方法的參數(shù)列表必須相同,不相同則為方法重載
- 修飾符范圍可以擴(kuò)大但是不能縮小,private(?。┄C>proteated–>default–>public(大)
- 重寫(xiě)可能會(huì)拋出異常,異常范圍可以被縮小但不能擴(kuò)大
為什么需要重寫(xiě)?
- 父類(lèi)的功能子類(lèi)不一定需要或者不一定滿足,父類(lèi)的東西太多了子類(lèi)可能只需要一點(diǎn)
快捷鍵Alt+insert
快速創(chuàng)建Override
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
JAVA實(shí)現(xiàn)生成順序ID,不浪費(fèi)ID
這篇文章主要介紹了JAVA實(shí)現(xiàn)生成順序ID,不浪費(fèi)ID問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04SpringBoot集成Redis—使用RedisRepositories詳解
這篇文章主要介紹了SpringBoot集成Redis—使用RedisRepositories詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Java設(shè)計(jì)模式之單例模式簡(jiǎn)單解析
這篇文章主要介紹了Java設(shè)計(jì)模式之單例模式簡(jiǎn)單解析,單例模式的優(yōu)點(diǎn)在于在內(nèi)存中某個(gè)類(lèi)只有一個(gè)實(shí)例,減少了內(nèi)存的開(kāi)銷(xiāo),尤其是頻繁的創(chuàng)建和銷(xiāo)毀實(shí)例,避免對(duì)資源的多重暫用,需要的朋友可以參考下2023-12-12SpringBoot集成Graphql Query實(shí)戰(zhàn)示例
這篇文章主要為大家介紹了SpringBoot集成Graphql Query實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Java基于NIO實(shí)現(xiàn)群聊系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java基于NIO實(shí)現(xiàn)群聊系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Spring?Cloud中Sentinel的兩種限流模式介紹
如何使用Sentinel做流量控制呢?這篇文章就來(lái)為大家詳細(xì)介紹了Spring?Cloud中Sentinel的兩種限流模式,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-05-05java序列化對(duì)象根據(jù)不同配置動(dòng)態(tài)改變屬性名的方法
本文主要介紹了java序列化對(duì)象根據(jù)不同配置動(dòng)態(tài)改變屬性名的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05