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
}
{
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;
}
}
總結:
若想在靜態方法中訪問類的例項成員,則需要先例項化一個物件,通過物件加點的形式,對屬性進行訪問。