日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

super构造方法为什么给子类赋值_【Java学习 | Javase】super

發布時間:2023/12/3 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 super构造方法为什么给子类赋值_【Java学习 | Javase】super 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

整理自:動力節點基礎講義

super

概述

  • 嚴格來說,super其實并不是一個引用,它只是一個關鍵字,super代表了當前對象中從父類繼承過來的那部分特征。換句話說,super其實是this的一部分,從父類繼承過來的屬性和方法,在內存方面使用了super關鍵字標記

  • super和this都可以使用在實例方法中

  • super不能使用在靜態方法中,因為super代表了當前對象上的父類型特征,靜態方法中沒有this,肯定也不能使用super


super使用在構造方法

”super(實參列表);“是通過當前的構造方法調用父類的構造方法

  • ”super(實參列表);“調用父類構造方法時,從本質上說并不是創建一個“獨立的父類對象”,而是為了完成當前對象的父類型特征的初始化操作,也是為了代碼復用,使用用法見【Java學習 | Javase】繼承與多態


super使用在實例方法

  • 當父類中有該實例變量,子類中又重新定義了同名的實例變量,如果想在子類中訪問父類的實例變量,super不能省略,因為此時父類的實例變量被隱藏了,實例方法亦是如此

  • 總結:父類和子類中有同名實例變量或者同名實例方法,想在子類中訪問父類中的實例變量或實例方法,則super不能省略,其他情況都可以省略


代碼展示

1、super并不是一個單獨的引用

  • 通過測試,可以看出this是單獨使用的引用,而super無法輸出編譯器提示要輸出"super.xxx",可見super不是指向某個獨立的對象,也不是保存某個地址

代碼

public?class?Test{
????public?static?void?main(String[]?args)?{???
????????H1?h?=?new?H2();
????????h.doSome();
????}
}

class?H1{
????public?void?doSome()?{???
????????System.out.println(this);
????????System.out.println(super);
????}
}

輸出結果

????錯誤:?需要'.'
????????System.out.println(super);
????????????????????????????????^
????錯誤:?需要')'
????????System.out.println(super);
?????????????????????????????????^
????錯誤:?需要';'
????????System.out.println(super);
??????????????????????????????????^
????錯誤:?解析時已到達文件結尾
}
?^
4?個錯誤

2、super不能在靜態方法中使用

  • 如果是寫成System.out.println(super),那么編譯器會報出上面的錯誤而不是現在的錯誤

代碼

public?class?Test{
????public?static?void?main(String[]?args)?{???
????????System.out.println(this);
????????System.out.println(super.toString());
????}
}

輸出結果

錯誤:?無法從靜態上下文中引用非靜態?變量?this
????????System.out.println(this);
???????????????????????????^
錯誤:?無法從靜態上下文中引用非靜態?變量?super
????????System.out.println(super.toString());
???????????????????????????^

3、靜態代碼塊、靜態變量、實例變量的綜合測試

分析

  • 靜態變量有順序,故先初始化k,然后依次到t1、t2,由于實例變量的初始化在創建對象時執行,故t1和t2創建之前會先執行j。然后到i、n,接著到靜態代碼塊,再然后到main方法。需要注意的是,執行t1、t2時由于i、n沒有初始化(沒執行到),故是缺省默認值

代碼

public?class?Test{
????public?static?int?k?=?0;
????public?static?Test?t1?=?new?Test("t1");
????public?static?Test?t2?=?new?Test("t2");
????public?static?int?i?=?print("i");
????public?static?int?n?=?99;
????public?int?j?=?print("j");
????static{
????????System.out.println("靜態塊");??
????}
????public?Test(String?str){
????????System.out.println((++k)+":"+str+"??i?=?"+i+"???n?=?"+n);
????????++i;
????????++n;
????}
????public?static?int?print(String?str){
????????System.out.println((++k)+":"+str+"??i?=?"+i+"???n?=?"+n);
????????++n;
????????return?++i;
????}
????public?static?void?main(String[]?args)?{???
????????new?Test("init");
????}
}

輸出結果

1:j?????i?=?0???n?=?0
2:t1????i?=?1???n?=?1
3:j?????i?=?2???n?=?2
4:t2????i?=?3???n?=?3
5:i?????i?=?4???n?=?4
靜態塊
6:j?????i?=?5???n?=?99
7:init??i?=?6???n?=?100??????

學習沒有捷徑,能力增強自信,樂觀有益人生!

總結

以上是生活随笔為你收集整理的super构造方法为什么给子类赋值_【Java学习 | Javase】super的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。