在Java中變數分為primitive與reference兩種,primitive就是Day2提到的八大基本型別。除了八大基本型別外,剩下的變數都是指向物件的參考,你可以把變數想像成一個容器,由於物件的體積太大了,塞不進小小的變數裡,因此物件參考變數裡裝的不是值而是儲存物件在記憶中的位址,也就是reference。
宣告: <類別名稱><變數名稱> :Phone myPhone;
實體化物件: 如果要產生該物件真正的記憶體空間,必須以關鍵字new來建立:new Phone();
初始化物件: 用=(指定運算子)指派該物件至物件參考變數:myPhone = new Phone();
Phone p1 = new Phone();
Phone p2 = new Phone();
System.out.print(p1 == p2) // false, 因為記憶體位址不同
Phone p1 = new Phone();
Phone p2 = p1;
System.out.print(p1 == p2) // true, 因為記憶體位址相同
int i = 10;
int j = 10;
System.out.print(i == j) // true, 因為變數值相同
Java只有傳值沒有傳參考!
Java只有傳值沒有傳參考!
Java只有傳值沒有傳參考!
很重要講三次,其實Java一直就是只有傳值,如果是給基本資料型態變數的話就是把值傳給它,如果是要給物件的話就是傳記憶體的位址(也是一個值)。如果傳入的參數為基本資料型態(primitive型態)時,在method內對參數的改變不會影響原來在method外變數的值
public class PassArgTest{
static void passValue(double value){
value = 20.0;
}
}
public static void main(String[] args){
double price = 10.0;
passValue(price);
System.out.println(price); // 10.0
}
如果傳入的參數為物件參考變數或陣列(reference型態)時,無法更動reference對象,但可以更動reference對象原變數的值,也可以使用reference對象的methods與變數。
public class PassArgTest{
static void passReference(Phone myPhone){
myPhone price = 20.0;
}
}
public static void main(String[] args){
Phone myPhone = new Phone();
myPhone.price = 10.0
passReference(myPhone);
System.out.println(myPhone.price); // 10.0
}