iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0
Software Development

Java入門的30張門票系列 第 4

[Day4] 物件參考變數又是什麼變數

  • 分享至 

  • xImage
  •  

在Java中變數分為primitive與reference兩種,primitive就是Day2提到的八大基本型別。除了八大基本型別外,剩下的變數都是指向物件的參考,你可以把變數想像成一個容器,由於物件的體積太大了,塞不進小小的變數裡,因此物件參考變數裡裝的不是值而是儲存物件在記憶中的位址,也就是reference。

建立物件參考變數 Object Reference Variables

宣告: <類別名稱><變數名稱> :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, 因為變數值相同

傳值 & 傳址

傳值 Pass by value(值)

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
}

傳址 Pass by address(值)

如果傳入的參數為物件參考變數或陣列(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
}

上一篇
[Day3] Java世界裡各式各樣的運算子
下一篇
[Day5] String其實是個物件
系列文
Java入門的30張門票30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言