你對類初始化的過程瞭解多少?

csnd的這個學生空間還是不錯的,值得關注,剛纔連續複製粘貼了以前的帖子(有一篇是摘抄的,但是原文作者找不到了,慚愧!),正好今天晚上有時間,拿出來幾個問題和大家分享!

第一題:

public class Test {
     int a=10;
     public Test(){
        a=0;
     }
     public static void main(String args[]){
        System.out.println(new Test().a);
     }
}

輸出結果是什麼呢?是不是有點模棱兩可啊,呵呵,趕快拿起編譯器自己試試吧!

答案 0

第二題:

class Insect{
   int i=9;
   int j;
   Insect(){
      prt("i="+i+",j="+j);
      j=39;
   }
   static int x1=prt("static Insect.x1");
   static int prt(String s){
       System.out.println(s);
       return 47;
   }
}
public class Beetle extends Insect{
    int k=prt("beetle.k");
    Beetle(){
       prt("k="+k);
       prt("j="+j);
    }
    static int x2=prt("static Beetle.x2");
    public static void main(String[] args){
       prt("Beetle constructor");
       Beetle b=new Beetle();
    }
}

這道題好像是摘抄自<<thinking in java>>一書,具體哪個章節忘記了。

看了頭是不是稍微有點暈呢?呵呵,答案是

static Insect.x1
static Beetle.x2
Beetle constructor
i=9,j=0
beetle.k
k=47
j=39

以下是一些規則(我很久以前寫的,不過如今讀來仍受益匪淺,希望對你也有所幫助!)

一JVM用到某個類時纔會將該類裝載進來,如果該類擁有父類,則會先將該類的父類裝載進來。

二當一個類被JVM裝載,則會初始化static修飾的成員。

三當調用某個類的構造函數時,如果該類擁有父類,則會先調用父類的構造函數。在執行構造函數裏的語

   句前,先會初始化該類中非static的成員(static修飾的成員在裝載時已被初始化).

具體分析過程我就不寫了,相信大家已經能自己找到答案了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章