Java關(guān)于含有繼承類的成員初始化過程講解
參考資料《Java 編程思想》,關(guān)于含有基類的導出類,其成員的初始化過程是一個容易讓人困惑的地方,下面通過具體的實例進行講解,代碼取自《Java 編程思想》,代碼如下:
import static net.mindview.util.Print.*; /** * All rights Reserved, Designed By www.tydic.com * * @project: MyExerciseProject * @Title: Beetle.java * @Package: * @Description: TODO(Learn java) * @Author: Yang Xiaoyong * @Date: 2017年10月30日 下午4:22:19 * @Version: V1.0 * @Copyright: 2017 Inc. All rights reserved. 注意:本內(nèi)容僅限于學習交流使用,禁止外泄以及用于其他的商業(yè)目的 */ public class Beetle extends Insect { private int k = printInit("Beetle.k Initialized"); Beetle() { // TODO Auto-generated constructor stub print("k = " + k); print("j = " + j); } private static int x2 = printInit("static Beetle.x2 initialized"); public static void main(String[] args) { print("Beetle constructor"); Beetle beetle = new Beetle(); } } class Insect { private int i = 9; protected int j; Insect() { // TODO Auto-generated constructor stub print("i = " + i + ". j = " + j); j = 39; } private static int x1 = printInit("static Insert.x1 initialized"); static int printInit(String s) { print(s); return 47; } }
程序輸出結(jié)果為:
則UML類圖為:
則Beetle
是導出類,Insect
是基類,當程序試圖從main()函數(shù)入口點進入,下面是運行過程:
- 1. 首先需要由加載器將編譯好的Beetle.class文件加載到JVM中。
- 2. 通過extends 關(guān)鍵字識別基類Insect,加載Insect.class文件。
至此,完成類的加載過程。然后,可以進行對象的創(chuàng)建。
對程序輸出結(jié)果進行分析:因為靜態(tài)成員變量在類加載的時候進行初始化,而在運行main()
函數(shù)之前,完成加載類的過程。所以在執(zhí)行main()函數(shù)之前,x1, x2已經(jīng)完成初始化過程,注意此時初始化過程是一個從基類“向外”擴散的,類似導出類的構(gòu)造器的構(gòu)建過程。輸出如下:
static Insert.x1 initialized
static Beetle.x2 initialized
之后,在創(chuàng)建Beetle
的過程中,其基類的構(gòu)造器會被自動調(diào)用,所以首先執(zhí)行Inspect構(gòu)造器里面的內(nèi)容,完成print()
函數(shù),并對j的變量賦值。最后,調(diào)用Beetle類自身的構(gòu)造器進行對象的創(chuàng)建,最終輸出符合分析。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時丟失精度問題
這篇文章主要介紹了SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時丟失精度問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06SpringBoot實現(xiàn)Excel讀取的實例教程
這篇文章主要給大家介紹了關(guān)于SpringBoot實現(xiàn)Excel讀取的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12Java8中stream和functional interface的配合使用詳解
這篇文章主要給大家介紹了關(guān)于Java8中stream和functional interface配合使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用java8具有一定的參考學習價值,需要的朋友們下面來一起看看吧。2017-11-11RedisKey的失效監(jiān)聽器KeyExpirationEventMessageListener問題
這篇文章主要介紹了RedisKey的失效監(jiān)聽器KeyExpirationEventMessageListener問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05Java多線程中Thread.currentThread()和this的區(qū)別詳解
這篇文章主要介紹了Java多線程中Thread.currentThread()和this的區(qū)別詳解,Thread.currentThread()方法返回的是對當前正在執(zhí)行的線程對象的引用,this代表的是當前調(diào)用它所在函數(shù)所屬的對象的引用,需要的朋友可以參考下2023-08-08Java中線程的等待與喚醒_動力節(jié)點Java學院整理
在Object.java中,定義了wait(), notify()和notifyAll()等接口。wait()的作用是讓當前線程進入等待狀態(tài),同時,wait()也會讓當前線程釋放它所持有的鎖。下面通過本文給大家介紹Java中線程的等待與喚醒知識,感興趣的朋友一起看看吧2017-05-05淺析Java數(shù)據(jù)庫操作工具包jOOQ的使用
jOOQ?是一個輕量級的?Java?ORM(對象關(guān)系映射)框架,可用來構(gòu)建復雜的?SQL?查詢,這篇文章主要來和大家介紹一下jOOQ的使用,需要的可以參考下2024-04-04