类初始化的一道面试题
下面的代碼counter1,counter2輸出的結果是什么,把第10行放到12行后面,ounter1,counter2輸出的結果是什么? 為什么?
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
原因是類初始化的準備階段,會為靜態變量分配內存,并設置默認初始值,此時singleton=null,counter1=0,counter2=0;然后在初始化階段,為靜態變量賦初始值,這時從上往下初始化,先new Singleton(), counter1=1,counter2=1,然后11行counter1沒變,counter2被重新賦值為0。
2. counter1=1,counter2=1
原因是代碼順序換了,new Singleton()在后面執行。
?
類的初始化時機:主動使用(六種)
– 創建類的實例
– 訪問某個類或接口的靜態變量,或者對該靜態 變量賦值
– 調用類的靜態方法
– 反射(如 Class.forName(“com.shengsiyuan.Test”) )
– 初始化一個類的子類 – Java虛擬機啟動時被標明為啟動類的類(Java Test)?
除了上述六種情形,其他使用Java類的方 式都被看作是被動使用,不會導致類的初始化?
其他情況一:只有當程序訪問的靜態變量或靜態方法確 實在當前類或當前接口中定義時,才可以 認為是對類或接口的主動使用?
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子類的靜態代碼塊沒有被執行,說明子類沒有被初始化。
其他情況二:調用ClassLoader類的loadClass方法加載 一個類,并不是對類的主動使用,不會導 致類的初始化。?
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不會對類進行初始化。
轉載于:https://www.cnblogs.com/lostyears/p/8917380.html
總結
以上是生活随笔為你收集整理的类初始化的一道面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到杏和桃子怎么回事
- 下一篇: 数据预处理和特征工程