1、類的主動(dòng)引用,一定會(huì)發(fā)生類的初始化。當(dāng)虛擬機(jī)啟動(dòng),先初始化main方法所在的類
實(shí)例化一個(gè)類的對(duì)象
調(diào)用類的靜態(tài)成員(除了final常量)和靜態(tài)方法
使用java.lang.reflect包的方法對(duì)類進(jìn)行反射調(diào)用
當(dāng)初始化一個(gè)類,如果其父類沒(méi)有被初始化,則先會(huì)初始化它的父類
2、類的被動(dòng)引用,不會(huì)發(fā)生類的初始化
當(dāng)訪問(wèn)一個(gè)靜態(tài)域時(shí),只有真正聲明這個(gè)域的類才會(huì)被初始化。如:當(dāng)通過(guò)子類引用父類的靜態(tài)變量,不會(huì)導(dǎo)致子類初始化
通過(guò)數(shù)組定義類引用,不會(huì)觸發(fā)此類的初始化
引用常量不會(huì)觸發(fā)此類的初始化(常量在鏈接階段就存入調(diào)用類的常量池中了)
實(shí)例
package com.volcano.reflection;
//什么時(shí)候會(huì)發(fā)生類的初始化,除了第一個(gè)注釋一直開(kāi)著,其他都要獨(dú)立打開(kāi)測(cè)試,否則不準(zhǔn)確
public class TestReflection3 {
static {
//1.虛擬機(jī)啟動(dòng)就會(huì)最先初始化main方法所在的類 會(huì)
System.out.println("main方法被加載");
}
public static void main(String[] args) throws ClassNotFoundException {
//2.實(shí)例化一個(gè)對(duì)象 會(huì)
//new Father();
//3.調(diào)用類的靜態(tài)成員(除了final常量)和靜態(tài)方法 會(huì)
//System.out.println(Son.a);
//4.使用java.lang.reflect包的方法對(duì)類進(jìn)行反射調(diào)用 會(huì)
//Class cls = Class.forName("com.volcano.reflection.Father");
//5.當(dāng)初始化一個(gè)類,如果其父類沒(méi)有被初始化,則先會(huì)初始化它的父類 會(huì)
//new Son();
//6.當(dāng)訪問(wèn)一個(gè)靜態(tài)域時(shí),只有真正聲明這個(gè)域的類才會(huì)被初始化 不會(huì)
//System.out.println(Father.a);//兩個(gè)都是只加載Father
//System.out.println(Son.a);//因?yàn)閍是Father的靜態(tài)成員
//7.通過(guò)數(shù)組定義類引用,不會(huì)觸發(fā)此類的初始化 不會(huì)
//Father[] fathers = new Father[10];
//8.引用常量不會(huì)觸發(fā)此類的初始化 不會(huì)
//System.out.println(Father.B);
}
}
class Father{
static {
System.out.println("Father被加載");
}
static int a=100;
static final int B = 300;
}
class Son extends Father{
static {
System.out.println("Son被加載");
}
static int c=200;
}
以上就是java類的兩種引用方法,希望對(duì)大家有所幫助。更多關(guān)于“java培訓(xùn)”的問(wèn)題,歡迎咨詢千鋒教育在線名師。千鋒教育多年辦學(xué),課程大綱緊跟企業(yè)需求,更科學(xué)更嚴(yán)謹(jǐn),每年培養(yǎng)泛IT人才近2萬(wàn)人。不論你是零基礎(chǔ)還是想提升,都可以找到適合的班型,千鋒教育隨時(shí)歡迎你來(lái)試聽(tīng)。