this與static
1 this
在物件建立的同時,他們都會擁有一份屬於自己的變數,但是function卻是大家共用的,這點不需要死記,思考一下就會知道為什麼
想想看在變數宣告的時候,name這個空間裡面放的是他的值,例如Dog的name裡放的就是"Happy",Cat的name裡放的就是"HelloKitty",因此每個物件都要有自己的變數空間,name空間裡的值才不會被重覆覆蓋掉。
但是function就不一樣,大家的使用的function都是同一個,例如無論是Doggy還是Happy實體,function內容都不會有所改變,所以物件再被建立時並不會另外規劃function的空間,大家都呼叫共用的那個function
public void changeName(String NewName){
name=NewName;
}
事實上像這樣的語法,等同於在呼叫如下程式碼,只是我們一般會忽略不寫
public void changeName(String NewName){
this.name=NewName;
}
1-1 用this呼叫建構子
假如我們有以下程式碼,我們宣告了兩個建構子,一個是會設定他的資料,一個沒有傳入任何參數,我們自動將他的資料全部設成"not set"
class Dog extends Animal{
Dog(String n,int a,String c){
super(n,a,c);
}
Dog(){
this("not set",0,"not set");
}
.....
}
this("not set",0,"not set");
以上這行this(...)的語法等同於在呼叫Dog的建構子,而且傳入的是三個參數,判斷呼叫的為上方有三個參數的建構子
2 static
還記得我以前說過以static宣告的變數或是function在程式執行的期間,屬於它的記憶體空間將會永遠存在,直到整個程式終結
但是其他變數就不是,像是class裡的所有非static的變數和function,都只有在我們new出一個object的同時,他才會擁有屬於自己的記憶體空間,所以編譯器也才可以辨識和呼叫得到。
假如我們有一個如下的class
class Dog extends Animal{
...
@Override
public void bark(){
System.out.println("汪");
}
public static void GetNewsPaper(){
System.out.println("取得報紙");
}
....
}
- bark(),非static function,只有在object被產生時才會被放入記憶體空間
- GetNewsPaper(),static function,在程式開始啟動時就被放入記憶體了
public class MainClass {
public static void main(String[] args){
//沒有建立object呼叫
Dog.GetNewsPaper();//成功
//Dog.bark(); //error:Cannot make a static reference to the non-static method bark()
Dog Happy=new Dog();
Happy.bark(); //成功
Happy.GetNewsPaper();//會有警告,但依然可以成功執行
}
}
----------------------------------
取得報紙
汪
取得報紙
可以見到當我們要呼叫static的function時,只要使用
ClassName.FunctionName(...);
ex. Dog.GetNewsPaper()
最下面一行的此種用法不推薦,基本上static function我們都會統一使用以上寫法
所以會跑出黃底的警告,但是這樣宣告依舊可以執行,因為她還是找得到GetNewsPaper()的語法,只是用法比較有錯誤而已
Happy.GetNewsPaper();
我們以前使用過求次方的Math.pow語法,就是用static function產生出的,從他的語法結構就可以看出
我們並沒有宣告math的Object卻仍可以使用他的function
System.out.println("2的3次方="+Math.pow(2, 3));
----------------------------
2的3次方=8.0