1. 程式人生 > >Java02-動手動腦及實踐性問題

Java02-動手動腦及實踐性問題

Java02-動手動腦及實踐性問題

Java欄位初始化的規律:

原始碼:

public class InitializeBlockDemo {

/**

 * @param args

 */

public static void main(String[] args) {

 

InitializeBlockClass obj=new InitializeBlockClass();

System.out.println(obj.field);

obj=new InitializeBlockClass(300);

System.out.println(obj.field);

}

 

}

class InitializeBlockClass{

//下面這句在初始化塊之前與之後,會影響到field欄位的初始值

//public int field=100;

 

{

    field=200;

}

public int field=100;

public InitializeBlockClass(int value){

this.field=value;

}

public InitializeBlockClass(){

 

}

}

執行測試結果:

public int field=100;

 

{

    field=200;

}

其值為200。

{

    field=200;

}

public int field=100;

其值為:100。

 

總結:當初始化一個物件時,按照類定義中的初始化順序進行初始化,在定義後部分的初始化內容會覆蓋之前的初始化效果。

靜態初始化塊的執行順序:

原始碼:

class Root

{

static{

System.out

.println("Root的靜態初始化塊");

}

{

System.out.println("Root的普通初始化塊");

}

public Root()

{

System.out.println("Root的無引數的構造器");

}

}

class Mid extends Root

{

static{

System.out.println("Mid的靜態初始化塊");

}

{

System.out.println("Mid的普通初始化塊");

}

public Mid()

{

System.out.println("Mid的無引數的構造器");

}

public Mid(String msg)

{

//通過this呼叫同一類中過載的構造器

this();

System.out.println("Mid的帶引數構造器,其引數值:" + msg);

}

}

class Leaf extends Mid

{

static{

System.out.println("Leaf的靜態初始化塊");

}

{

System.out.println("Leaf的普通初始化塊");

}

public Leaf()

{

//通過super呼叫父類中有一個字串引數的構造器

super("Java初始化順序演示");

System.out.println("執行Leaf的構造器");

}

 

}

public class TestStaticInitializeBlock

{

public static void main(String[] args)

{

new Leaf();

}

}

執行測試結果:

 

總結:

就這個程式而言,執行一個類的建構函式時,要先往上面找,一直找到繼承的那個最高階的類,首先執行靜態初始化塊,從繼承的最高階的類執行到當前這個類的靜態初始化塊(如果有的話),之後仍是按照這個順序執行每個類的普通初始化塊(如果有的話)和每個類的建構函式,之後呼叫了父類中有字串引數的建構函式。最後執行當前類最後的一條輸出語句。

在靜態方法中訪問類的例項成員:

源程式:

class Employee

{

String name;

long salary;

short employee_id;

static int total_employees;

static void clear(){

       Employee emp=new Employee();

       emp.name=”panda”;//增加的內容

       emp.salary=99999;//增加的內容

total_employees=0;

}

}

總結:

若想在靜態方法中訪問類的例項成員,則需要先例項化一個物件,通過物件加點的形式,對屬性進行訪問。