日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

类初始化的一道面试题

發(fā)布時(shí)間:2023/11/29 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 类初始化的一道面试题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

下面的代碼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 CL

ClassLoader的loadClass不會(huì)對(duì)類進(jìn)行初始化。

轉(zhuǎn)載于:https://www.cnblogs.com/lostyears/p/8917380.html

總結(jié)

以上是生活随笔為你收集整理的类初始化的一道面试题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。