今日在Java中super關(guān)鍵字的作用
你好呀,我是你們的老朋友小林~今天想和大家聊聊一個(gè)看似簡(jiǎn)單卻經(jīng)常被忽視的Java關(guān)鍵字——super。很多人學(xué)完繼承就以為“我懂了”,但真正用起來(lái)才發(fā)現(xiàn):原來(lái)它不只是個(gè)語(yǔ)法糖!?
Q:super到底是個(gè)啥?
A:簡(jiǎn)單說(shuō),它是用來(lái)調(diào)用父類成員(方法或構(gòu)造器)的關(guān)鍵字。比如你寫了一個(gè)子類Animal,里面有個(gè)方法叫run(),而父類Dog里也有run()——這時(shí)候你想在子類里“借用”父類的方法邏輯,又不想完全重寫,那就可以用super.run()。
Q:舉個(gè)真實(shí)案例唄?
A:當(dāng)然!我前幾天寫了個(gè)寵物管理系統(tǒng),父類是Pet:
class Pet { protected String name; public Pet(String name) { this.name = name; System.out.println("創(chuàng)建了寵物:" + name); } public void eat() { System.out.println(name + "正在吃飯!"); }}然后我寫了子類Cat:
class Cat extends Pet { private String color; public Cat(String name, String color) { super(name); // ?? 必須放在第一行!調(diào)用父類構(gòu)造器 this.color = color; System.out.println("貓的顏色是:" + color); } @Override public void eat() { super.eat(); // ?? 調(diào)用父類eat方法 System.out.println("貓用爪子扒飯,超可愛(ài)!??"); }}你看,如果沒(méi)寫super(name),編譯直接報(bào)錯(cuò)!因?yàn)楦割悩?gòu)造器沒(méi)被調(diào)用,Java不答應(yīng)。而super.eat()讓貓先吃,再加一句“用爪子扒飯”,這就是優(yōu)雅的代碼復(fù)用!
Q:那super能調(diào)用父類屬性嗎?
A:可以!雖然一般我們用this訪問(wèn)當(dāng)前對(duì)象屬性,但當(dāng)子類有同名變量時(shí),可以用super.屬性名明確指定父類的。比如:
class Dog extends Pet { private String name = "旺財(cái)"; // 子類覆蓋了父類name public void showName() { System.out.println("子類名字:" + name); System.out.println("父類名字:" + super.name); // 明確調(diào)用父類的name }}是不是很清晰?再也不怕屬性混淆啦~
??小貼士:記住三個(gè)關(guān)鍵點(diǎn):
構(gòu)造器中必須第一行寫super(...),否則編譯失敗
方法中可用super.方法名()調(diào)用父類邏輯
屬性沖突時(shí)用super.屬性名精準(zhǔn)定位
姐妹們,別小看這個(gè)super,它是面向?qū)ο缶幊痰摹皹蛄骸薄屇慵饶芾^承,又能靈活定制。下次寫繼承代碼時(shí),記得帶上它哦~??
歡迎留言討論你遇到的super坑!??

