java中具有繼承關系的類及其對象初始化順序

先說結論
對于具有繼承關系的類,它們的類和對象構造順序為:父類的類構造器() -> 子類的類構造器() -> 父類成員變量的賦值和實例代碼塊 -> 父類的構造函數 -> 子類成員變量的賦值和實例代碼塊 -> 子類的構造函數。

實驗代碼如下:

public class ExtensionTest {public static void main(String[] args) {new SubClass();}
}class SuperClass
{{System.out.println("我是父類實例塊");}static {System.out.println("我是父類類構造塊");}public SuperClass(){System.out.println("我是父類構造函數塊");}
}
class SubClass extends SuperClass
{{System.out.println("我是子類實例塊");}static {System.out.println("我是子類類構造塊");}public SubClass(){System.out.println("我是子類構造函數塊");}}

結果:

我是父類類構造塊
我是子類類構造塊
我是父類實例塊
我是父類構造函數塊
我是子類實例塊
我是子類構造函數塊

解釋:
類構造塊是初始化類的時候執行的,而初始化類首先得加載類(不加載類進內存當然沒法初始化)。
類實例塊是放在該類構造函數最前面和父類構造函數之后執行的。因為子類的構造函數調用之前,會先調用父類的構造函數。

基于上述兩條規則,我們再來看執行順序。
new SubClass()也就是要構造SubClass這個類的一個對象,而要構造這個對象,首先必須把這個類的描述、定義加載進內存(類加載)。因此要先加載這個類(不過此時還未初始化)。
加載完這個類之后,想要構造這個類的對象。但是此時這個類的靜態變量還未被初始化,因此要先初始化這個類,但是初始化這個類需要先初始化它的父類,因此此時就變成了,加載父類->初始化父類(調用靜態塊,即類構造塊)
->初始化子類(調用靜態塊,即類構造塊)。
然后就可以構造這個類的對象了,構造這個類的對象之前,要先構造父類對象,因此會先調用父類的構造函數,而調用父類構造函數之前又會先調用父類的實例塊。
然后就到了子類構造函數,然而執行之前一樣要先調用子類的實例塊,最后才是子類的構造函數的函數體。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536908.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536908.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536908.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql varchar 2000能存_mysql 數據庫 varchar 到底可以存多少數據呢,長文慎入

一、關于UTF-8 UTF-8 Unicode Transformation Format-8bit。是用以解決國際上字符的一種多字節編碼。 它對英文使用8位(即一個字節),中文使用24位(三個字節)來編碼。 UTF-8包含全世界所有國家需要用到的字符,是國際編碼,通用性強。 UTF-8編碼…

教程 | 如何利用C++搭建個人專屬的TensorFlow

在開始之前,首先看一下最終成型的代碼: 分支與特征后端(https://github.com/OneRaynyDay/autodiff/tree/eigen)僅支持標量的分支(https://github.com/OneRaynyDay/autodiff/tree/master)這個項目是我與 Min…

docker kali安裝mysql_kali安裝docker(有效詳細的教程) ——vulhub漏洞復現 001

前記:博主有著多次安裝docker的豐富經驗,曾經為了在kali成功安裝docker花費不少時間。在kali2016.3一直到最新的kali2019.4都通吃!所以跟著下面的步驟走,絕對不會出錯。(該機子此前沒裝過docker,并且配置好了kali更新源…

PDF文件如何轉成markdown格式

百度上根據pdf轉makrdown為關鍵字進行搜索,結果大多數是反過來的轉換,即markdown文本轉PDF格式。 但是PDF轉markdown的解決方案很少。 正好我工作上有這個需求,所以自己實現了一個解決方案。 下圖是一個用PDF XChange Editor打開的PDF文件&am…

kangle支不支持PHP_【轉載】PHP調用kangle的API

摘要:根據管理的API公布寫了一個類封裝了一個操作集合,這是一個kangleAPI的一個封...根據管理的API公布寫了一個類封裝了一個操作集合,這是一個kangleAPI的一個封裝吧,是在其他地方看到的,接口包含獲取easypanel的信息…

ES6 學習筆記(一)let,const和解構賦值

let和const let和const是es6新增的兩個變量聲明關鍵字,與var的不同點在于: (1)let和const都是塊級作用域,在{}內有效,這點在for循環中非常有用,只在循環體內有效。var為函數作用域。 &#xff0…

mysql數據庫容量和性能_新品速遞丨容量盤性能提升超 300%,數據庫支持 MySQL 8.0...

2關系型數據庫 MySQL Plus支持 MySQL 8.0 內核及 XtraBackup 物理在線遷移方式關系型數據庫服務 MySQL Plus 發布新版本 1.0.6 , 新增多項功能,提升了集群自動化運維能力。主要升級有:- 支持 MySQL 8.0 內核:根據官方測試&#xf…

10. Python面向對象

Python從設計之初就已經是一門面向對象的語言,正因為如此,在Python中創建一個類和對象是很容易的。如果接觸過java語言同學應該都知道,Java面向對象三大特征是:封裝、繼承、多態。Python面向對象也有一些特征,接下來我…

mysql聚簇索引 和主鍵的區別_[MySQL] innoDB引擎的主鍵與聚簇索引

MysqL的innodb引擎本身存儲的形式就必須是聚簇索引的形式,在磁盤上樹狀存儲的,但是不一定是根據主鍵聚簇的,有三種情形:1. 有主鍵的情況下,主鍵就是聚簇索引2. 沒有主鍵的情況下,第一個非空null的唯一索引就是聚簇索引3. 如果上面都沒有,那么就是有一個隱藏的row-id作為聚簇索引…

前端頁面:一直報Cannot set property 'height' of undefined

1、出現錯誤的例子,只拷貝了項目中關鍵出現問題的部分 例子中明明寫了styleheight:16px這個屬性,但是為什么還說height未定義呢 通過打印發現:cks.each(function () { autoTextAreaHeight($(this)); });中的$(this)取出來…

mysql表在線轉成分區表_11g普通表在線轉換分區表

本帖最后由 燈和樹 于 2016-5-4 14:58 編輯由于業務系統數據量增大,對其用戶表在線完成分區表轉換過程,記錄如下,11g數據庫支持。創建過渡分區表根據USER_ID創建分區表CREATE TABLE SDP_SMECD.TEST_T_USER_ID(USER_ID NUMBER(13) …

tiger4444/rabbit4444后綴勒索病毒怎么刪除 能否百分百恢復

上海某客戶中了tiger4444的勒索病毒,找到我們后,一天內全部恢復完成。說了很多關于勒索病毒的事情,也提醒過大家,可總是有人疏忽,致使中招后,丟錢丟面子,還丟工作。 那么要怎樣預防呢與處理呢&a…

mysql遠程一會不用卡住_連接遠程MySQL數據庫項目啟動時,不報錯但是卡住不繼續啟動的,...

連接遠程MySQL數據庫項目啟動時,不報錯但是卡住不繼續啟動的,2018-03-12 17:08:52.532DEBUG[localhost-startStop-1]o.s.beans.factory.support.DefaultListableBeanFactory.doGetBean():251 -Returning cached instance of singleton bean ‘org.spring…

GPT-5、開源、更強的ChatGPT!

年終歲尾,正值圣誕節熱鬧氣氛的OpenAI寫下了2024年的發展清單。 OpenAI聯合創始人兼首席執行官Sam Altman在社交平臺公布,AGI(稍晚一些)、GPT-5、更好的語音模型、更高的費率限制; 更好的GPTs;更好的推理…

CentOS_7 安裝MySql5.7

2019獨角獸企業重金招聘Python工程師標準>>> 下載mysql的源 wget http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm 安裝yum庫 yum localinstall -y mysql57-community-release-el7-7.noarch.rpm 安裝MySQL yum install -y mysql-community-…

python查詢mysql decimal報錯_python讀取MySQL數據表時,使用ast模塊轉換decimal格式數據的坑...

概述MySQL中常用的數據格式有tinyint()、int()、float()、double()、decimal() 、varchar、enum()、datetime;小數格式中decimal比較常用,因為更加精確,這里就以decimal為例。從MySQL中讀取了一行數據,內容為:(17479, datetime.da…

性能測試總結(一)---基礎理論篇(轉載)

隨著軟件行業的快速發展,現代的軟件系統越來越復雜,功能越來越多,測試人員除了需要保證基本的功能測試質量,性能也隨越來越受到人們的關注。但是一提到性能測試,很多人就直接連想到Loadrunner。認為LR就等于性能測試&a…

java listen_JavaWeb之Filter、Listener

昨天和大家介紹了一下JSON的用法,其實JSON中主要是用來和數據庫交互數據的。今天給大家講解的是Filter和Listener的用法。一、Listenner監聽器1.1、定義Javaweb中的監聽器是用于監聽web常見對象HttpServletRequest,HttpSession,ServletContext。1.2、監聽器的作用監…

BFC的概念及作用

在了解什么是BFC之前,首先得明白什么是Box , Formatting Context (一個決定如何渲染文檔的容器)的概念 Box: CSS布局的基本單位 Box是 CSS 布局的對象和基本單位, 直觀點來說, 就是一個頁面是由很多個 Box組成的&#…

bitcount java_java-Long.bitCount()如何找到設置的位數?

讓我們以255為例.我們將這些位組合在一起.首先,我們從255開始,為0b1111.1111(二進制為8 1)第一行代碼是:i i - ((i > > > 1) & 0x5555555555555555L);這條線正在梳理每對1.由于我們有8個1,所以我們希望組合成對,并得到2,2,2,2之類的東西.由于它是二進…