JAVA新手教學 -6 區域、屬性變數與set、get方法

上一期我們提到了類別與方法的宣告及呼叫,今天就來講講最經典的set、get方法吧!但在這之前,我們要先了解到區域變數與屬性變數的差別在哪裡,以及如何使用。話不多說,讓我們開始吧!

區域變數:

  • 方法內宣告的變數
  • 只能在該方法內使用
  • 區域變數存在於方法的「執行空間」
  • 方法開始執行時產生,結束時清除。

以下列程式碼為例,變數x和參數a(參數也是變數的一種)都是存在於method1方法中,method1執行結束後,變數會被清除,是無法在method2被呼叫的,這種變數我們稱之為區域變數各個方法各自的區域變數並不會影響其他方法的區域變數

 

區域變數在記憶體的生命週期:

以下列程式碼為例,變數number在方法開始時產生,方法結束時清除。

public class Calculator{
public void getSquare(){\\方法開始
int number=10;
number=number*number;
System.out.printf(“10的平方是%d“,number);
     }\\方法結束
}


 

那麼該如何在兩個方法內 共用變數呢?接下來我們來看看屬性變數

 

屬性變數:

  • 類別內,方法外宣告的變數。
  • 不同於區域變數,屬性變數會記錄該類別的物件個別資料,在類別的任何方法中共同使用
  • 屬性變數存在於物件中,自物件new(初始化)時產生,至物件清除回收時清除。
  • 語法:使用權限(public or private)+型別(type)+變數名稱,如下列程式碼
  • 如果未給定初始值,其值為0null

public class Calculator{
public int x=10;\\屬性變數
public void getSquare(){
System.out.print(x*x);
     }
}

  • 雖然類別的屬性變數可以分散在類別內方法外的不同位置宣告,不過建議在類別最開始的位置集中宣告,方便日後使用時容易辨識其屬性,如下圖。

 

屬性變數在記憶體的生命週期:

以下圖為例,物件c1產生時,在c1裡會有一個屬性變數x其值為10,在main方法執行結束後消除。

 

屬性變數的呼叫:

  • 在同一類別內呼叫,不論屬性變數宣告為publicprivate,皆可以直接呼叫。
  • 呼叫語法:直接呼叫。
  • 若在此類別以外的地方呼叫屬性變數需要宣告為public,並透過物件呼叫。
  • 呼叫語法:物件+.+屬性變數

 

保留字private:

  • private屬性或方法只能在該類別中使用,限制其他類別不可直接存取或修改。
  • 宣告屬性變數為private,是物件導向程式設計中用來隱藏資料的做法。
  • 大部分的屬性變數存取權限應設定為private。

 

setget方法:

搞懂了區域變數和屬性變數的差別以及private保留字的用意後,就可以正式進入到setget方法了。

private屬性

若不希望被物件的使用者直接存取,需使用下列兩個方法。

  • set方法:間接變更其值,無回傳型別,有參數,程式段內設定屬性變數的值。
  • get方法:間接取得其值,有回傳型別,無參數,程式段內僅回傳屬性變數。

 

我們以銀行為例子,銀行當然不希望每個人都可以調正自己帳戶內的數字餘額,所以必須在程式設計上使用setget方法來阻止使用者直接更改原始資料。今天我們有一個類別叫做Account,類別中有一整數private屬性變數money以及設定money值的setget方法setMoney、getMoney。如下列程式碼所示,將set方法的參數值丟給money,再利用get方法return來取得money的值。

public class Account{
private int momey;
public void setMoney(int a){money=a;}//set方法
public int getMoney(){return money;}//get方法
}

在有main方法的類別做測試,先產生Account類別的物件a,這個物件a含有一個private屬性變數money,因為是private屬性所以無法在其他類別直接呼叫或更改,須使用setget方法取得其變數值,利用物件a呼叫該Account類別中的set方法,打入引數更改money值。再藉由物件呼叫get方法取得其值,放在列印語法內列印出來,直接呼叫get方法不會顯示任何東西喔,很多人打完get方法直接按執行鍵沒出現任何東西,是因為忘記要打列印指令!

public class AccountTest{
public static void main(String args[]){
Account a=new Account();
a.setMoney(5000);//呼叫set方法
System.out.println(a.getMoney());//呼叫get方法
   }
}

 

我們也可以在setget方法中增加一些條件,來篩選屬性變數的值,最好的例子就是if指令,假如我今天不希望存款數為負數,我必須在set方法內加入條件,get方法同理,如果存款金額太大不希望其他人知道,可以回傳上限值。

public class Account{
private int momey;
public void setMoney(int a){
if(a<0){money=0;}
else money=a;}//set方法
public int getMoney(){
if(money>10000){money=10000;}
return money;}//get方法
}

 

接下來就利用今天教的setget方法來寫一段ATM存錢和領錢的程式碼吧!首先要產生一個ATM類別,有setget方法及private屬性變數money,初始值為零。setMoney有限制如果輸入值為負數,則設定為0。接著可以利用與set方法相同原理來寫存錢與領錢的方法名稱為save和withdraw。程式碼如下圖所示,save方法的參數如果小於0則列印「數值不得為負數」,withdraw方法也是,不過需要比較存款餘額是否大於參數,如果參數的數值大於存款餘額,最後存款餘額會是負的。

 

接著我們產生一個含有main方法的類別,由於需要使用者輸入所以要先在類別外打【import java.util.Scanner;】後,在main方法內打【Scanner input=new Scanner(System.in);】產生Scanner的物件input,這樣之後才可以請使用者輸入。產生ATM類別的物件account,為了方便測試提錢與存錢的功能是否正常,我們先利用set方法設定money的值。詢問使用者(我們)初始值為多少後打【int a=input.nextInt();】,將輸入的數值複製給變數a,接著利用account呼叫set方法,引數為a。

 

詢問要存錢還領錢,再讓使用者輸入,利用if條件判斷要存錢還領錢,根據判斷結果執行不同的程式,如下圖。最後再利用列印語法把money列印出來。

 

如果不用get方法會出現錯誤,因為money是private屬性,無法在其他別存取或更改。

 

執行結果有很多種,大家可以自己玩玩看。

 

大家可能會覺得為甚麼需要private屬性?全都public不就不需要setget方法了嗎?其實private屬性的存在不光是為了要保護資料,還要讓使用者不能輕易更改程式,如果使用者不小心動到了一些不該動的程式,到時候工程師還要去修復這些問題,為了節省這些麻煩以及隱藏資訊的重要性,才會有了private這一系列的概念。

肥柴
肥柴
文章: 30

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料