繼承時的初始化

例:

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();
 }
}

輸出結果:

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

首先要明確三條規則:

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

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

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

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

瞭解了以上三點後,對以上輸出結果進行分析:

  首先程序的入口是main(),在Beetle這個類中,又由於該類有父類Insect,根據第一,二條規則,首先裝載Insect類,初始化Insect內的靜態成員,輸出static Insect.x1。接着裝載Beetle類,初始化Beetle的靜態成員,輸出static Beetle.x2

這個時候纔開始執行main()中的語句:

 prt("Beetle constructor");輸出Beetle constructor。  

 Beetle b=new Beetle();會調用Beetle的無參構造方法,根據第三條規則,會調用其父類Insect的無參構造方法(),在執行該方法之前,會初始化變量i=9;j=0;接着執行該方法內的語句:

  prt("i="+i+",j="+j);輸出i=9,j=0 。這時候j=39.

初始化Beetle內的成員,

 int k=prt("beetle.k");輸出:beetle.k。k=47。

最後才執行Beetle構造方法內的語句:

  prt("k="+k);輸出k=47

  prt("j="+j);輸出j=39

 

 

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