6-3 方法變數與類別變數
6-3-1 變數的生存範圍 某一變數被宣告產生之後,可以使用的範圍如何,這也值得商榷的,稱為生存範圍。基本上,變數的生存範圍僅限制於被宣告時的程式區塊內,越過了程式區塊,便失去了效用。但程式區塊可能經由多層次的程式區塊所構成,即是區塊內可能再出現子程式區塊,子程式區塊內又可能再出現更內圈的子程式區塊,依此類推層層包圍。每一層次區塊都可能會宣告變數,變數的生存範圍可能會影響到程式運作的正確性如何。 雖然每一層次所宣告變數的生存範圍不同,但也沒有那麼複雜。生存範圍最重要的概念是,『外層次所宣告的變數,在該層次內的任何子層次都是有效的;任何內部所宣告的變數,在它的外層次是無效的』。另一重點是『程式區塊』為何,以 Java 語言為例,可能出現的有:
(1) 類別實體:宣告類別後,利用左右大括號({ ….})所包圍的實體區塊(Body)。 (2) 函數實體:宣告函數(方法)後,利用左右大括號({ ….})所包圍的實體區塊(Body)。 (3) 選擇敘述區塊:選擇命令(如 if/else/switch/case)的敘述實體。 (4) 迴圈敘述區塊:迴圈命令(如 for/while/do-while)的敘述實體。 簡單的說,利用左右大括號({ ….})包起來,即是一個程式實體。大括號內所宣告的變數,超過大括號以外則無效,即是它的生存範圍。另外,任何敘述句所出現的大括號皆有此特性。 6-3-2 類別變數與方法變數 簡單的說,實體區塊內所宣告的變數,僅存活於該區塊內,區塊以外便不存在了。但區塊內可能再宣告另一個或多個子區塊,這種情況下,在父區塊或子區塊所宣告變數的存活空間有何不同? 在傳統程式語言(如 C 語言)之下,父區塊所宣告的變數,在子區塊還是存活著,稱之為『整體變數』;而子區塊所宣告的,在父區塊或同等父區塊的子區塊下是無效的。Java 語言大致上沿用傳統語言規範,要特別留意的是,不同方法之間變數要互相引用時,必須將其宣告成『靜態變數』(static variable),如圖 6-4 所示。
圖 6-8 類別變數與區域變數 6-3-3 範例研討:擲骰子大吃小搏奕 (A)程式功能:Ex6_3.java 擲骰子賭博大多不喜歡『通吃』規則,為了增加次數與趣味性,都採用大吃小的規則,越多人參與賭越好玩,擲出最大者吃最小者。請製作一套大吃小的擲骰子遊系統,參賭者輸入姓名後擲出 3 個骰子,隨時告知目前領先者與點數(隱藏最低者姓名與點數),直接鍵入『Enter』 表示結束參與者,立即顯示出贏家與輸家為何人,以及其擲出點數為何。期望操作介面如下: (B)製作技巧研討: 依照系統要求,我們可以歸納出下列重點:(請參考圖 6_4) (1) 必須隨時紀錄最高與最低者姓名,以及所擲出的點數,將其宣告成類別變數(maxName、minName、maxNum 與 minNum)。 (2) 系統希望參賽者人數不定,利用『Enter』表示結束。利用所讀入的字串變數(name),其內容的字元長度為 0,則表示輸入『Enter』;因此,可利用 length() 方法判斷字串長度是否為 0。 (C)程式範例:
(D) 程式重點分析: (1) 第 6~7 行:『static String maxName=’””, …』。宣告 nmaxName、minName、maxNum 與 minNum 變數為靜態類別變數,可被直接存取於 main 與 game 方法內敘述。 (2) 第 12 行:『String name;』。宣告字串變數 name,此為 main 方法內的區域變數,也僅存活於 main 方法內。 (3) 第 17 行:『while(name.length() !=0 { …})』。此為 while 迴圈敘述,條件是判斷 name 變數內子串長度是否為 0(name.length() !=0),如長度大於 0 則表示有輸入任何字元,該字串即是玩家的姓名;如果長度為 0 的話,則表示直接敲入『Enter』鍵,妹有輸入任何字元,表示結束的功能。 (4) 第 18 行:『game(name);』。呼叫 game() 方法,並攜帶 name 變數(玩家姓名)內容為引數。 (5) 第 29~47 行:『static void game(String name) { …}』 。宣告 game 方法程式區塊,功能是產生 3 次 1~6 的亂數(擲骰子動作),並顯出擲骰子結果。最後與 maxNum 與 minNum 比較是否最大或最小,如是的話,則更改 maxName、maxNum 內容,或 minName 與 minNum 內容(以上皆是靜態變數)。 (6) 第 31 行:『Random random = new Random();』。宣告產生 Random 物件,為區域物件僅存活於 game 方法內。 (7) 第 32 行:『int ran, sum =0;』。區域變數,僅存活於 game 方法內。 (8) 第 34 行:『for(int k=1; k<=3; k++) { ..}』。變數 k 是 for 迴圈的區域變數,僅存活於 for 迴圈內。 6-3-4 自我挑戰:改良型博弈遊戲 (A)程式功能:PM6_X.java 在Ex6_3 範例中,如果有兩人擲同樣的點數,會取得先擲的人,我們希望將它修改一下,讓後面擲出的點數與前面的人相同時,請他再重新擲一次。 (B)提示:請自行演練
|
翻轉工作室:粘添壽
Java 程式設計(一) 含程式邏輯
翻轉電子書系列:
|