<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文重點介紹super關鍵字,在Java中的作用以及用法。
它是一個指代變數,用於在子類中指代父類別物件。
只能用於子類別建構函式和實體方法中,不能用於子類的類(靜態)方法中。原因是super指代的是一個父類別的物件,它需要在執行時被建立,而靜態方法是類方法,它是類的一部分。當類被載入時,方法已經存在,但是這時候父類別物件還沒有被初始化。
在Java中super有兩種使用場景。
在子類中呼叫父類別的屬性或方法。特別是子類中有與父類別相同的屬性或者方法,那麼這時如果你想呼叫父類別的屬性或者方法,那麼你必須使用super關鍵字。因為子類中和父類別中的屬性或方法同名,則父類別中的方法或屬性將被覆蓋或隱藏。super可以指代父類別中的類屬性和類方法,但是並不建議這麼用,雖然不會報錯,但是說明你對static關鍵字還不夠了解。請認真檢視並理解static關鍵字。
public class Parent { public String name = "小頭爸爸"; public boolean hasMoney = false; public void sleeping(){ System.out.println("爸爸已經睡了"); } public void working(){ System.out.println("爸爸正在工作。。。"); } } public class Child extends Parent { public String name = "大頭兒子"; /** * 當子類和父類別有屬性重名時,需要super才能呼叫到父類別的屬性, * 直接呼叫會呼叫到子類的屬性 * 如果不重名,可直接呼叫且呼叫的是父類別的屬性 */ private void testParam(){ System.out.println("爸爸的名字叫" + super.name); System.out.println("孩子的名字是" + name); System.out.println("爸爸是否有有錢:" + hasMoney); } /** * 方法和上面的屬性結果一樣 */ public void testMethod(){ sleeping(); super.sleeping(); super.working(); } public void sleeping(){ System.out.println("兒子已經睡了"); } public static void main(String[] args) { Child child = new Child(); child.testParam(); child.testMethod(); } }
測試結果:
=============
爸爸的名字叫小頭爸爸
孩子的名字是大頭兒子
爸爸是否有有錢:false
兒子已經睡了
爸爸已經睡了爸爸正在工作。。。
============
在Java中,子類是父類別的派生類,它的範例化依賴於父類別的範例化。所以它的任何一個建構函式都必須要初始化父類別,Java就是super關鍵字呼叫父類別構造方法,來完成這個操作。
有人會奇怪,那為什麼在2.1.1的例子,父類別沒有構造方法,子類也沒有構造方法,難道在某些情況下,範例的初始化並不依賴於建構函式?
答案是,範例的初始化必須要建構函式。2.2.1沒有建構函式的原因是,在Java類定義中,如果開發者沒有顯示的定義建構函式,那麼Java會隱式的為該類定義一個無參建構函式。但是如果開發者自己定一個建構函式(無論有參還是無參),那麼Java就不會再為該類隱式的定義一個無參建構函式了。
那麼還原建構函式後的程式碼:
public class Parent { ... public Parent() { } ... } public class Child extends Parent { ... public Child() { } ... }
那麼又有人有奇怪了,你不是說子類的範例化依賴於父類別的範例化,那麼在子類別建構函式中應該需要呼叫super來初始化父類別不是嗎?
是的,在我們子類別建構函式中,如果我們沒有顯式呼叫super來初始化父類別的話,那麼Java會隱式的呼叫super();來呼叫父類別無參建構函式並把它放在建構函式的第一行。記住哦,Java只會隱式的呼叫無參建構函式,如果父類別沒有無參建構函式,那麼子類中就必須顯示的呼叫super關鍵字來呼叫已有的有參建構函式來初始化父類別。
public class Parent { public String name = "小頭爸爸"; public Parent(int age) { } public void sleeping(){ System.out.println("爸爸已經睡了"); } } public class Child extends Parent { public String name = "大頭兒子"; public Child() {//如果沒有super來初始化父類別,同樣也會報錯 // super();//編譯期報錯,因為父類別並沒有無參建構函式 super(15);//正確開啟方式 } private void printParentName(){ System.out.println("爸爸的名字叫" + super.name); } private void parentStatus(){ super.sleeping(); } }
子類中的super為什麼必須要放在第一行?因為子類的範例化依賴於父類別的範例化,在構建子類時,必須要有父類別範例,只能有了父類別的範例,子類才能夠初始化自己。就好像人類世界裡,都是要先有父親,再有孩子一樣。
下面來看看super關鍵字的實際用法。 在這裡,Emp類繼承了Person類,所以Person的所有屬性都將預設繼承到Emp。 要初始化所有的屬性,可使用子類的父類別建構函式。 這樣,我們重用了父類別的建構函式。
class Person { int id; String name; Person(int id, String name) { this.id = id; this.name = name; } } class Emp extends Person { float salary; Emp(int id, String name, float salary) { super(id, name);// reusing parent constructor this.salary = salary; } void display() { System.out.println(id + " " + name + " " + salary); } } class TestSuper5 { public static void main(String[] args) { Emp e1 = new Emp(1, "ankit", 45000f); e1.display(); } }
結果如下:
1 ankit 45000
super關鍵字指代父類別物件,主要用於在子類中指定父類別的方法和屬性,也用於在子類中初始化父類別。子類的靜態方法中不能使用super關鍵字。
到此這篇關於Java基礎之super關鍵字的文章就介紹到這了,更多相關Java super關鍵字內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45