类初始化的一道面试题
下面的代碼counter1,counter2輸出的結(jié)果是什么,把第10行放到12行后面,ounter1,counter2輸出的結(jié)果是什么? 為什么?
1 public class Test { 2 public static void main(String[] args) { 3 System.out.println(Singleton.counter1); 4 System.out.println(Singleton.counter2); 5 } 6 7 } 8 9 class Singleton{ 10 private static Singleton singleton = new Singleton(); 11 public static int counter1; 12 public static int counter2=0; 13 private Singleton(){ 14 counter1++; 15 counter2++; 16 } 17 public static Singleton getInstance(){ 18 return singleton; 19 } 20 }1. counter1=1,counter2=0
原因是類初始化的準(zhǔn)備階段,會(huì)為靜態(tài)變量分配內(nèi)存,并設(shè)置默認(rèn)初始值,此時(shí)singleton=null,counter1=0,counter2=0;然后在初始化階段,為靜態(tài)變量賦初始值,這時(shí)從上往下初始化,先new Singleton(), counter1=1,counter2=1,然后11行counter1沒變,counter2被重新賦值為0。
2. counter1=1,counter2=1
原因是代碼順序換了,new Singleton()在后面執(zhí)行。
?
類的初始化時(shí)機(jī):主動(dòng)使用(六種)
– 創(chuàng)建類的實(shí)例
– 訪問某個(gè)類或接口的靜態(tài)變量,或者對(duì)該靜態(tài) 變量賦值
– 調(diào)用類的靜態(tài)方法
– 反射(如 Class.forName(“com.shengsiyuan.Test”) )
– 初始化一個(gè)類的子類 – Java虛擬機(jī)啟動(dòng)時(shí)被標(biāo)明為啟動(dòng)類的類(Java Test)?
除了上述六種情形,其他使用Java類的方 式都被看作是被動(dòng)使用,不會(huì)導(dǎo)致類的初始化?
其他情況一:只有當(dāng)程序訪問的靜態(tài)變量或靜態(tài)方法確 實(shí)在當(dāng)前類或當(dāng)前接口中定義時(shí),才可以 認(rèn)為是對(duì)類或接口的主動(dòng)使用?
1 public class Test { 2 public static void main(String[] args) { 3 System.out.println(Child.a); 4 } 5 } 6 7 class Parent { 8 static int a = 3; 9 static { 10 System.out.println("Parent static block"); 11 } 12 static void doSomething(){ 13 System.out.println("do something"); 14 } 15 } 16 class Child extends Parent{ 17 static { 18 System.out.println("Child static block"); 19 } 20 }輸出
Parent static block 3子類的靜態(tài)代碼塊沒有被執(zhí)行,說明子類沒有被初始化。
其他情況二:調(diào)用ClassLoader類的loadClass方法加載 一個(gè)類,并不是對(duì)類的主動(dòng)使用,不會(huì)導(dǎo) 致類的初始化。?
1 public class Test { 2 public static void main(String[] args) throws ClassNotFoundException { 3 ClassLoader loader = ClassLoader.getSystemClassLoader(); 4 Class<?> clazz = loader.loadClass("com.test.CL"); 5 System.out.println("---------------"); 6 clazz = Class.forName("com.test.CL"); 7 } 8 } 9 10 class CL { 11 static { 12 System.out.println("Class CL"); 13 } 14 }輸出
--------------- Class CLClassLoader的loadClass不會(huì)對(duì)類進(jìn)行初始化。
轉(zhuǎn)載于:https://www.cnblogs.com/lostyears/p/8917380.html
總結(jié)
以上是生活随笔為你收集整理的类初始化的一道面试题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到杏和桃子怎么回事
- 下一篇: 数据预处理和特征工程