JAVA新手教學 (6) – 區域、屬性變數與 set、get 方法
JAVA新手教學 (5) 中我們提到了類別與方法的宣告及呼叫,今天就來講講最經典的 set、get 方法吧!但在這之前,我們要先了解到區域變數與屬性變數的差別在哪裡,以及如何使用。話不多說,讓我們開始吧!
用 Telegram 訂閱挨踢路人甲最新文章:https://t.me/itwshare
追蹤挨踢路人甲粉絲專頁:https://www.facebook.com/itwalker
區域變數:
- 在方法內宣告的變數
- 只能在該方法內使用
- 區域變數存在於方法的「執行空間」
- 方法開始執行時產生,結束時清除。
以下列程式碼為例,變數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)+變數名稱,如下列程式碼。
- 如果未給定初始值,其值為0或null。
public class Calculator{
public int x=10;\\屬性變數
public void getSquare(){
System.out.print(x*x);
}
}
- 雖然類別的屬性變數可以分散在類別內方法外的不同位置宣告,不過建議在類別最開始的位置集中宣告,方便日後使用時容易辨識其屬性,如下圖。
屬性變數在記憶體的生命週期:
以下圖為例,物件c1產生時,在c1裡會有一個屬性變數x其值為10,在main方法執行結束後消除。
屬性變數的呼叫:
- 在同一類別內呼叫,不論屬性變數宣告為public或private,皆可以直接呼叫。
- 呼叫語法:直接呼叫。
- 若在此類別以外的地方呼叫屬性變數需要宣告為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這一系列的概念。
延伸閱讀:
- JAVA新手教學 (0) – Eclipse 整合式開發工具下載與安裝
- JAVA新手教學 (1) – 物件導向與類別基本概念
- JAVA新手教學 (2) – 原生型別變數
- JAVA新手教學 (3) – 運算子與簡易 if 指令
- JAVA新手教學 (4) – print 列印指令多變化與溢出字元
- JAVA新手教學 (5) – 類別與方法的宣告及使用