Java 程式設計(一)  第 六章 方法與套件引用  上一頁    下一頁

 

6-3 方法變數與類別變數

內容:

  • 6-3-1 變數的生存範圍

  • 6-3-2 類別變數與方法變數

  • 6-3-3 範例研討:擲骰子大吃小搏奕

  • 6-3-4 自我挑戰:改良型博奕遊戲

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) 必須隨時紀錄最高與最低者姓名,以及所擲出的點數,將其宣告成類別變數(maxNameminNamemaxNum minNum

(2) 系統希望參賽者人數不定,利用Enter』表示結束。利用所讀入的字串變數(name),其內容的字元長度為 0,則表示輸入『Enter』;因此,可利用 length() 方法判斷字串長度是否為 0

C)程式範例:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

//Ex6_3.java

 

import java.util.*;

public class Ex6_3 {

   /* 宣告類別變數 (整體變數)*/

    static String maxName="", minName="";

    static int maxNum=0, minNum=99;

 

    /* main 方法開始 */

    public static void main(String args[]) {

      Scanner keyin = new Scanner(System.in); // 區域物件

      String name;                            // 區域變數

      int number;                             // 區域變數

      System.out.printf("=== 歡迎光臨大吃小擲骰子遊戲 ===\n");

      System.out.printf("輸入姓名並擲骰子 (Enter 結束) =>");

      name = keyin.nextLine();

      while(name.length() !=0) {

          game(name);

         System.out.printf("領先者 %s 先生 %d \n", maxName,  maxNum);

          System.out.printf("輸入姓名並擲骰子 (Enter 結束) =>");

          name = keyin.nextLine();

       }

       System.out.printf("贏家 %s 先生擲出 %d\n", maxName, maxNum);

       System.out.printf("輸家 %s 先生擲出 %d\n", minName, minNum);

    }

    /* game 方法開始 */

    static void game(String name) {

        Random random = new Random();            // 區域物件

        int ran, sum=0;                          // 區域變數

        System.out.printf("\t您擲出 => ");

        for (int k=1; k<=3; k++) {               // 區域變數

             ran= 1 + random.nextInt(6);

             System.out.printf("%d   ", ran);

             sum = sum + ran;

        }

        System.out.printf("合計 = %d\n", sum);

        if (sum > maxNum) {

             maxName = name;

             maxNum = sum;

        }

        if(sum <= minNum) {

             minName = name;

             minNum = sum;

        }

    }

}

(D) 程式重點分析:

(1) 6~7 static String maxName=’””, …。宣告 nmaxNameminNamemaxNum minNum 變數為靜態類別變數,可被直接存取於 main game 方法內敘述。

(2) 12 String name;。宣告字串變數 name,此為 main 方法內的區域變數,也僅存活於 main 方法內。

(3) 17 :『while(name.length() !=0 { …})。此為 while 迴圈敘述,條件是判斷 name 變數內子串長度是否為 0name.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 比較是否最大或最小,如是的話,則更改 maxNamemaxNum 內容,或 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 程式設計(一) 含程式邏輯

 

 

翻轉電子書系列: