Java類初始化執(zhí)行流程解析
測(cè)試代碼:
package com.test.ClassLaoderTest;
public class test1 {
public static String s_variable = "靜態(tài)變量";
public String init_variable = "公開的變量";
private String p_variable = "私有的變量";
//靜態(tài)代碼塊
static {
System.out.println(s_variable);
System.out.println("靜態(tài)代碼塊初始化執(zhí)行了");
}
//初始化代碼塊
{
System.out.println(init_variable);
System.out.println(p_variable);
System.out.println("初始化代碼塊執(zhí)行淪");
}
//構(gòu)造方法
public test1(){
System.out.println("我是構(gòu)造方法");
}
public static void main(String[] args) {
}
}
直接運(yùn)行:

main方法里面不做任何調(diào)用的情況下,自動(dòng)調(diào)用的是靜態(tài)代碼塊和靜態(tài)變量
(2)調(diào)用靜態(tài)變量和靜態(tài)方法:
測(cè)試代碼:
package com.test.ClassLaoderTest;
public class test1 {
public static String s_variable = "靜態(tài)變量";
public String init_variable = "公開的變量";
private String p_variable = "私有的變量";
//靜態(tài)代碼塊
static {
System.out.println(s_variable);
System.out.println("靜態(tài)代碼塊初始化執(zhí)行了");
}
//初始化代碼塊
{
System.out.println(init_variable);
System.out.println(p_variable);
System.out.println("初始化代碼塊執(zhí)行淪");
}
//構(gòu)造方法
public test1(){
System.out.println("我是構(gòu)造方法");
}
//靜態(tài)方法
public static void test1(){
System.out.println("這是靜態(tài)方法");
}
public static void main(String[] args) {
System.out.println(test1.s_variable);
test1.test1();
}
}
運(yùn)行:

結(jié)論:當(dāng)我調(diào)用靜態(tài)方法/靜態(tài)變量時(shí),只會(huì)家在靜態(tài)代碼塊,其余的代碼塊/構(gòu)造方法不會(huì)被加載
(3)創(chuàng)建對(duì)象:
package com.test.ClassLaoderTest;
public class test1 {
public static String s_variable = "靜態(tài)變量";
public String init_variable = "公開的變量";
private String p_variable = "私有的變量";
//靜態(tài)代碼塊
static {
System.out.println(s_variable);
System.out.println("靜態(tài)代碼塊初始化執(zhí)行了");
}
//初始化代碼塊
{
System.out.println(init_variable);
System.out.println(p_variable);
System.out.println("初始化代碼塊執(zhí)行了");
}
//構(gòu)造方法
public test1(){
System.out.println("我是構(gòu)造方法");
}
//靜態(tài)方法
public static void test1(){
System.out.println("這是靜態(tài)方法");
}
public static void main(String[] args) {
test1 t1 = new test1();
}
}
運(yùn)行結(jié)果:

輸出內(nèi)容:
靜態(tài)變量
靜態(tài)代碼塊初始化執(zhí)行了
公開的變量
私有的變量
初始化代碼塊執(zhí)行了
我是構(gòu)造方法
結(jié)論:當(dāng)創(chuàng)建對(duì)象/實(shí)例化的時(shí)候,調(diào)用順序:靜態(tài)代碼塊->初始化代碼->構(gòu)造方法,最后執(zhí)行的才是構(gòu)造方法
(4)有繼承關(guān)系下的類初始化執(zhí)行流程:
環(huán)境:
父類:
package com.test.ClassLaoderTest;
public class father {
public static String s_variable = "父類靜態(tài)變量";
public String init_variable = "父類公開的變量";
private String p_variable = "父類私有的變量";
//父類靜態(tài)代碼塊
static {
System.out.println(s_variable);
System.out.println("父類靜態(tài)代碼塊初始化執(zhí)行了");
}
//父類初始化代碼塊
{
System.out.println(init_variable);
System.out.println(p_variable);
System.out.println("父類初始化代碼塊執(zhí)行了");
}
//構(gòu)造方法
public father(){
System.out.println("我是父類構(gòu)造方法");
}
//父類靜態(tài)方法
public static void test1(){
System.out.println("這是父類靜態(tài)方法");
}
}
test1.java:
繼承其父類father:
package com.test.ClassLaoderTest;
public class test1 extends father{
public static String s_variable = "子類靜態(tài)變量";
public String init_variable = "子類公開的變量";
private String p_variable = "子類私有的變量";
//子類靜態(tài)代碼塊
static {
System.out.println(s_variable);
System.out.println("子類靜態(tài)代碼塊初始化執(zhí)行了");
}
//子類初始化代碼塊
{
System.out.println(init_variable);
System.out.println(p_variable);
System.out.println("子類初始化代碼塊執(zhí)行了");
}
//子類構(gòu)造方法
public test1(){
System.out.println("我是子類構(gòu)造方法");
}
//子類靜態(tài)方法
public static void test1(){
System.out.println("這是子類靜態(tài)方法");
}
public static void main(String[] args) {
}
}
main方法不做任何操作,運(yùn)行:

只要extends繼承了,優(yōu)先調(diào)用父類靜態(tài)代碼塊
(5)有繼承關(guān)系下的調(diào)用靜態(tài)方法:
修改子類即可:
package com.test.ClassLaoderTest;
public class test1 extends father{
public static String s_variable = "子類靜態(tài)變量";
public String init_variable = "子類公開的變量";
private String p_variable = "子類私有的變量";
//子類靜態(tài)代碼塊
static {
System.out.println(s_variable);
System.out.println("子類靜態(tài)代碼塊初始化執(zhí)行了");
}
//子類初始化代碼塊
{
System.out.println(init_variable);
System.out.println(p_variable);
System.out.println("子類初始化代碼塊執(zhí)行了");
}
//子類構(gòu)造方法
public test1(){
System.out.println("我是子類構(gòu)造方法");
}
//子類靜態(tài)方法
public static void test1(){
System.out.println("這是子類靜態(tài)方法");
}
public static void main(String[] args) {
test1.test1();
father.test1();
}
}
運(yùn)行:

結(jié)果:
父類靜態(tài)變量
父類靜態(tài)代碼塊初始化執(zhí)行了
子類靜態(tài)變量
子類靜態(tài)代碼塊初始化執(zhí)行了
這是子類靜態(tài)方法
這是父類靜態(tài)方法
main方法中,誰(shuí)優(yōu)先調(diào)用靜態(tài)方法,就優(yōu)先加載誰(shuí)
(6)有繼承關(guān)系下的創(chuàng)建對(duì)象:
代碼:
package com.test.ClassLaoderTest;
public class test1 extends father{
public static String s_variable = "子類靜態(tài)變量";
public String init_variable = "子類公開的變量";
private String p_variable = "子類私有的變量";
//子類靜態(tài)代碼塊
static {
System.out.println(s_variable);
System.out.println("子類靜態(tài)代碼塊初始化執(zhí)行了");
}
//子類初始化代碼塊
{
System.out.println(init_variable);
System.out.println(p_variable);
System.out.println("子類初始化代碼塊執(zhí)行了");
}
//子類構(gòu)造方法
public test1(){
System.out.println("我是子類構(gòu)造方法");
}
//子類靜態(tài)方法
public static void test1(){
System.out.println("這是子類靜態(tài)方法");
}
public static void main(String[] args) {
test1 t1 =new test1();
}
}
運(yùn)行:

結(jié)果:
父類靜態(tài)變量
父類靜態(tài)代碼塊初始化執(zhí)行了
子類靜態(tài)變量
子類靜態(tài)代碼塊初始化執(zhí)行了
父類公開的變量
父類私有的變量
父類初始化代碼塊執(zhí)行了
我是父類構(gòu)造方法
子類公開的變量
子類私有的變量
子類初始化代碼塊執(zhí)行了
我是子類構(gòu)造方法
結(jié)論:通過(guò)結(jié)果會(huì)發(fā)現(xiàn),不管是子類還是父類靜態(tài)代碼塊,靜態(tài)代碼塊在哪里都是爸爸級(jí)別,最先加載的,當(dāng)創(chuàng)建test1對(duì)象的時(shí)候,優(yōu)先加載的是父類代碼塊,那么他的初始化執(zhí)行流程如下:父類靜態(tài)代碼塊>子類靜態(tài)代碼塊>父類初始化代碼塊>父類構(gòu)造方法>子類代碼塊>子類構(gòu)造方法
(7) 有繼承關(guān)系下的創(chuàng)建父類對(duì)象:
package com.test.ClassLaoderTest;
public class test1 extends father{
public static String s_variable = "子類靜態(tài)變量";
public String init_variable = "子類公開的變量";
private String p_variable = "子類私有的變量";
//子類靜態(tài)代碼塊
static {
System.out.println(s_variable);
System.out.println("子類靜態(tài)代碼塊初始化執(zhí)行了");
}
//子類初始化代碼塊
{
System.out.println(init_variable);
System.out.println(p_variable);
System.out.println("子類初始化代碼塊執(zhí)行了");
}
//子類構(gòu)造方法
public test1(){
System.out.println("我是子類構(gòu)造方法");
}
//子類靜態(tài)方法
public static void test1(){
System.out.println("這是子類靜態(tài)方法");
}
public static void main(String[] args) {
father father = new father();
}
}
運(yùn)行:

結(jié)果:
父類靜態(tài)變量
父類靜態(tài)代碼塊初始化執(zhí)行了
子類靜態(tài)變量
子類靜態(tài)代碼塊初始化執(zhí)行了
父類公開的變量
父類私有的變量
父類初始化代碼塊執(zhí)行了
我是父類構(gòu)造方法
結(jié)論:優(yōu)先執(zhí)行的是兩個(gè)類的靜態(tài)代碼塊,然后是父類型的代碼塊和構(gòu)造方法,而子類的代碼塊和構(gòu)造方法沒有被執(zhí)行是因?yàn)闆]有實(shí)例化子類,所以肯定是沒有他的,那么只有在創(chuàng)建對(duì)象的時(shí)候,才會(huì)調(diào)用代碼塊和構(gòu)造方法
到此這篇關(guān)于Java類初始化執(zhí)行流程的文章就介紹到這了,更多相關(guān)Java類初始化執(zhí)行流程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java并發(fā)編程學(xué)習(xí)之Unsafe類與LockSupport類源碼詳析
- 詳細(xì)總結(jié)Java基礎(chǔ)類和包裝類
- Java數(shù)據(jù)類型之細(xì)講char類型與編碼關(guān)系
- 一文秒懂通過(guò)JavaCSV類庫(kù)讀寫CSV文件的技巧
- Java基礎(chǔ)之自定義類加載器
- java算法之靜態(tài)內(nèi)部類實(shí)現(xiàn)雪花算法
- Java虛擬機(jī)之類加載
- Java基礎(chǔ)之包裝類
- Java應(yīng)用EasyExcel工具類
- Java服務(wù)器主機(jī)信息監(jiān)控工具類的示例代碼
- java內(nèi)部類的定義與分類示例詳解
- Java并發(fā)編程之LockSupport類詳解
相關(guān)文章
java中多個(gè)@Scheduled定時(shí)器不執(zhí)行的解決方法
在應(yīng)用開發(fā)中經(jīng)常需要一些周期性的操作,比如每5分鐘執(zhí)行某一操作等,這篇文章主要給大家介紹了關(guān)于java中多個(gè)@Scheduled定時(shí)器不執(zhí)行的解決方法,需要的朋友可以參考下2023-04-04
StringBuffer與StringBuilder底層擴(kuò)容機(jī)制與常用方法
這篇文章主要給大家介紹了StringBuffer、StringBuilder底層擴(kuò)容機(jī)制與常用方法,有感興趣的小伙伴跟著小編一起來(lái)學(xué)習(xí)吧2023-07-07
基于Java在netty中實(shí)現(xiàn)線程和CPU綁定
這篇文章主要介紹了基于Java在netty中實(shí)現(xiàn)線程和CPU綁定,文章圍繞主題的相關(guān)內(nèi)容展開詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05
Docker搭建前端Java的開發(fā)環(huán)境詳解
相信每個(gè)人入職第一天就是搭建本地開發(fā)環(huán)境,因?yàn)槲宜居玫氖莏ava,看見了多年不見的eclipse的圖標(biāo)出現(xiàn)我的電腦上,我是難過(guò)的。后來(lái)知道并不是我一個(gè)人有此感受。這篇文章是為了解決前后端開發(fā)沒有徹底分離的坑,詳細(xì)的給大家介紹了利用Docker搭建前端Java的開發(fā)環(huán)境。2016-10-10
Javaweb實(shí)現(xiàn)在線人數(shù)統(tǒng)計(jì)代碼實(shí)例
這篇文章主要介紹了Javaweb實(shí)現(xiàn)在線人數(shù)統(tǒng)計(jì)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
Java并發(fā)編程示例(一):線程的創(chuàng)建和執(zhí)行
這篇文章主要介紹了Java并發(fā)編程示例(一):線程的創(chuàng)建和執(zhí)行,本文是系列文章的第一篇,需要的朋友可以參考下2014-12-12
SpringBoot打印Banner的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot啟動(dòng)Banner的實(shí)現(xiàn)原理和打印流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01

