package test01;
class 物件
{
static int 靜態欄位;
static void 靜態方法()
{
物件.靜態欄位 +=10; //靜態方法中呼叫靜態欄位,ok
System.out.println("靜態方法執行。物件.靜態欄位 +=10;");
}
int 動態欄位;
void 動態方法()
{
物件.靜態欄位 +=1; //在動態方法中呼叫靜態方法,ok
this.動態欄位 +=1; //呼叫自己本身的欄位,ok
System.out.println("動態方法執行。物件.靜態欄位 +=1;this.動態欄位 +=1;");
}
static
{
物件.靜態欄位 = 5; //注意,是「物件」.靜態欄位
// this.動態欄位 = 10; //靜態物件中使用this,一定會編譯錯誤
System.out.println("物件的靜態建構子執行。物件.靜態欄位 = 5;");
}
物件()
{
this.動態欄位 = 100; //注意,是「this」.動態欄位
// this.靜態欄位 =10; //使用this去使用靜態欄位。可以執行,但是不建議。
System.out.println("物件的動態建構子執行。this.動態欄位 = 100;");
}
}
public class RunMain
{
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
System.out.println("=====測試開始=====");
物件.靜態方法(); //沒問題,靜態方法可以直接執行。 但請注意它執行了些什麼。
//應該會多一行「物件的靜態建構子執行。」
// 物件.動態方法(); //這一行會出現錯誤,因為沒有物件實體
System.out.println("物件.靜態欄位:"+物件.靜態欄位);
System.out.println("==================\n");
//看懂這一篇後,打算進一步了解建構子的運作的話,你可以把這段之前的程式碼都註解起來
//看看一開始就直接宣告物件的程式碼會怎麼跑
//============================================================================
System.out.println("=====宣告物件=====");
物件 新物件 = new 物件(); //宣告一個實體,你會發現宣告這個動作會讓程式去跑一次建構子
//如果你之前從未動過任何靜態方法或是欄位,那這時也會先執行靜態建構子
System.out.println("物件.靜態欄位:"+物件.靜態欄位);
System.out.println("新物件.動態欄位:"+新物件.動態欄位);
System.out.println("==================\n");
System.out.println("=====使用物件=====");
新物件.動態方法(); //有實體,所以可以使用欄位
System.out.println("物件.靜態欄位:"+物件.靜態欄位);
System.out.println("新物件.動態欄位:"+新物件.動態欄位);
System.out.println("==================\n");
System.out.println("====第二個物件====");
物件 物件二 = new 物件();
System.out.println("物件.靜態欄位:"+物件.靜態欄位); //兩個物件使用同個靜態欄位
System.out.println("新物件.動態欄位:"+新物件.動態欄位); //這兩個物件有各自獨立的「動態欄位」
System.out.println("物件二.動態欄位:"+物件二.動態欄位); //兩個值都不一樣,彼此不相干
System.out.println("==================\n");
System.out.println("=兩個物件各自獨立=現在 物件二.動態欄位+=1000;");
物件二.動態欄位+=1000;
System.out.println("物件.靜態欄位:"+物件.靜態欄位);
System.out.println("新物件.動態欄位:"+新物件.動態欄位);
System.out.println("物件二.動態欄位:"+物件二.動態欄位);
System.out.println("==================\n");
}
}
|