詳解Java中類的加載與其初始化
java內(nèi)存分析

類加載的過(guò)程

類的加載與ClassLoader的理解

類的初始化
package Collections;
public class text1 {
public static void main(String[]args){
A a=new A();
System.out.println(A.m);
}
}
class A{
static {
System.out.println("A類靜態(tài)代碼塊初始化");
m=300;
}
static int m=100;
public A(){
System.out.println("A類的無(wú)參構(gòu)造初始化");
}
}輸出:
A類靜態(tài)代碼塊初始化
A類的無(wú)參構(gòu)造初始化
100
為什么最終輸出的m值為100呢?
分析如下:
首先類進(jìn)行加載和鏈接,如下所示:

注:在鏈接階段的準(zhǔn)備工作時(shí),編譯器會(huì)為類變量賦默認(rèn)值為0,即此時(shí)的m為0
鏈接完畢后進(jìn)行類的初始化,這一過(guò)程將會(huì)執(zhí)行類構(gòu)造器()方法,將類中所有類變量的賦值語(yǔ)句以及靜態(tài)代碼塊中的語(yǔ)句收集和合并:
<clinit>() {
System.out.println("A類靜態(tài)代碼塊初始化");
m=300;
m=100;
}
第二條m的賦值語(yǔ)句,覆蓋了第一條的300,因此最終輸出為100
會(huì)發(fā)生類的初始化的場(chǎng)景
類的主動(dòng)引用(一定會(huì)發(fā)生類的初始化)

類的主動(dòng)引用
package Collections;
import static Collections.Son.m;
public class text1 {
static {
System.out.println("Main類被加載");
}
public static void main(String[]args) throws ClassNotFoundException {
Son son=new Son();
}
}
class Father{
static int a=10;
static{
System.out.println("Father類被加載");
}
}
class Son extends Father{
static {
System.out.println("子類被加載");
m= 300;
}
static int m =100;
static final int M = 1;
}輸出:
Main類被加載
Father類被加載
子類被加載
反射也會(huì)產(chǎn)生主動(dòng)引用
package Collections;
import static Collections.Son.m;
???????public class text1 {
static {
System.out.println("Main類被加載");
}
public static void main(String[]args) throws ClassNotFoundException {
Class.forName("Collections.Son");
}
}
class Father{
static int a=10;
static{
System.out.println("Father類被加載");
}
}
class Son extends Father{
static {
System.out.println("子類被加載");
m= 300;
}
static int m =100;
static final int M = 1;
}輸出:
Main類被加載
Father類被加載
子類被加載
類的被動(dòng)引用(不會(huì)發(fā)生類的初始化)
當(dāng)訪問(wèn)一個(gè)靜態(tài)域時(shí),只有真正聲明這個(gè)域的類才會(huì)被初始化,如:當(dāng)通過(guò)子類引用父類的靜態(tài)變量,不會(huì)導(dǎo)致子類初始化。
舉例:
package Collections;
import static Collections.Son.m;
???????public class text1 {
static {
System.out.println("Main類被加載");
}
public static void main(String[]args) throws ClassNotFoundException {
System.out.println(Son.a);
}
}
class Father{
static int a=10;
static{
System.out.println("Father類被加載");
}
}
class Son extends Father{
static {
System.out.println("子類被加載");
m= 300;
}
static int m =100;
static final int M = 1;
}輸出:
Main類被加載
Father類被加載
10
通過(guò)數(shù)組定義類引用,不會(huì)觸發(fā)此類的初始化
舉例:
package Collections;
import static Collections.Son.m;
???????public class text1 {
static {
System.out.println("Main類被加載");
}
public static void main(String[]args) throws ClassNotFoundException {
Son[] arry=new Son[5];
}
}
class Father{
static int a=10;
static{
System.out.println("Father類被加載");
}
}
class Son extends Father{
static {
System.out.println("子類被加載");
m= 300;
}
static int m =100;
static final int M = 1;
}輸出:
Main類被加載
引用常量不會(huì)觸發(fā)此類的初始化(常量在鏈接階段就存入調(diào)用類的常量池中了)
舉例:
package Collections;
import static Collections.Son.m;
???????public class text1 {
static {
System.out.println("Main類被加載");
}
public static void main(String[]args) throws ClassNotFoundException {
System.out.println(Son.M);
}
}
class Father{
static int a=10;
static{
System.out.println("Father類被加載");
}
}
class Son extends Father{
static {
System.out.println("子類被加載");
m= 300;
}
static int m =100;
static final int M = 1;
}輸出:
Main類被加載
???????1
以上就是詳解Java中類的加載與其初始化的詳細(xì)內(nèi)容,更多關(guān)于Java類加載與初始化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java 實(shí)戰(zhàn)項(xiàng)目錘煉之嘟嘟健身房管理系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)健身房管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11
Java中的CopyOnWriteArrayList你了解嗎
CopyOnWriteArrayList是Java集合框架中的一種線程安全的List實(shí)現(xiàn),這篇文章主要來(lái)和大家聊聊CopyOnWriteArrayList的簡(jiǎn)單使用,需要的可以參考一下2023-06-06
java格式化數(shù)字操作 NumberFormat及DecimalFormat
這篇文章主要介紹了java格式化數(shù)字操作 NumberFormat及DecimalFormat,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java工作環(huán)境的配置與Eclipse的安裝過(guò)程
這篇文章主要介紹了Java工作環(huán)境的配置與Eclipse的安裝過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
解決fastjson泛型轉(zhuǎn)換報(bào)錯(cuò)的解決方法
這篇文章主要介紹了解決fastjson泛型轉(zhuǎn)換報(bào)錯(cuò)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Mybatis流式查詢之ResultHanlde問(wèn)題
這篇文章主要介紹了Mybatis流式查詢之ResultHanlde問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Spring Cloud Alibaba之Sentinel實(shí)現(xiàn)熔斷限流功能
這篇文章主要介紹了Spring Cloud Alibaba之Sentinel,這里使用阿里的sentinel來(lái)實(shí)現(xiàn)熔斷限流功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04

