16   類別(1)-再論類別和其注意事項

類別(Class)

在「Java程式長相」的章節中已概略說明了類別,在此再進一步對類別加以說明。類別是Java程式的基本單位,類別的成員包含欄位(Field)及方法(Method)。類別內不能執行敘述式,只能定義欄位及方法,而敘述式(運算及列印等操作)則包含於方法內。敘述式也可定義於建構式(後述)內。

格式:

[ public|abstract|final ] class 類別名稱 {

       宣告資料(變數及常數)欄位(Field)

       定義執行演算及其他操作的方法(Method)

}

 

[16-1一般類別和主類別]

含有名稱為main之主方法的類別稱為主類別,主類別之外姑且稱為一般類別。

 

[16-1-1一般類別]

不可單獨執行,必須被由主類別內之主方法或其他方法呼叫使用。

<範例>

class Score7 {

int Chi = 75 ;

    int Eng = 63 ;

    int Pro = 50 ;

    int totScore ;

    void comDisp( ){

      totScore = Chi + Eng + Pro ;  

      System.out.println ("總分=" + totScore ) ;

   }

}

編譯:C:\js>javac Score7.java

 

[16-1-2主類別]

含有名稱為main之方法的類別,為程式執行的起點,一個程式檔最多只能含有一個主類別。

<只包含主類別的原始碼檔- 可編譯執行>

class 主類別單獨執行 {

public static void main(String[ ] args) {

int 國文分數 = 81 ;

        int 英文分數 = 66 ;

        int 程式設計分數 = 71 ;

        int 總分;

        總分 = 國文分數+英文分數+程式設計分數 ;  

        System.out.println ("總分=" +總分 ) ;

   }

}

執行結果:C:\js>java 主類別單獨執行

總分=218

 

<主類別呼叫已編譯之其他一般類別>

class 主類別呼叫其他類別1{

public static void main(String[ ] args) {

Score7 tot = new Score7( ) ;//不同原始碼檔且已編譯之其他一般類別

tot.comDisp( ) ;

   }

}

執行結果:C:\js>java 主類別呼叫其他類別1

總分=188

 

<主類別呼叫同一原始碼檔之一般類別>

class 主類別呼叫其他類別2{

public static void main(String[ ] args) {

Score72 總分 = new Score72( ) ;//同一原始碼檔的一般類別

總分.comDisp( ) ;

   }

}

class Score72 {

int Chi = 66 ;

    int Eng = 77 ;

    int Pro = 55 ;

    int totScore ;

    void comDisp( ){

      totScore = Chi + Eng + Pro ;  

      System.out.println ("總分=" + totScore ) ;

   }

}

 

執行結果:C:\js>java 主類別呼叫其他類別2

總分=198

 

 

[16-2類別的注意事項]

[16-2-1運算及操作之敘述式不可宣告於方法範圍之外]

<一般類別>

class StateErr1 {

   int i = 50 ;

   int j =100 ;

   int t ;

   t = i + j ; //錯誤

   System.out.println("t ="+ (i + j)) ; //錯誤

}

編譯結果:

StateErr1.java:5: error: <identifier> expected

t = i + j ; //錯誤

   ^

StateErr1.java:6: error: <identifier> expected

System.out.println("t ="+ (i + j)) ; //錯誤

                   ^

StateErr1.java:6: error: illegal start of type

System.out.println("t ="+ (i + j)) ; //錯誤

                     ^

StateErr1.java:6: error: ')' expected

System.out.println("t ="+ (i + j)) ; //錯誤

                         ^

StateErr1.java:6: error: ';' expected

System.out.println("t ="+ (i + j)) ; //錯誤

                           ^

StateErr1.java:6: error: <identifier> expected

System.out.println("t ="+ (i + j)) ; //錯誤

                             ^

StateErr1.java:6: error: <identifier> expected

System.out.println("t ="+ (i + j)) ; //錯誤

                                 ^

StateErr1.java:6: error: illegal start of type

System.out.println("t ="+ (i + j)) ; //錯誤

                                   ^

StateErr1.java:6: error: <identifier> expected

System.out.println("t ="+ (i + j)) ; //錯誤

                                   ^

StateErr1.java:6: error: ';' expected

System.out.println("t ="+ (i + j)) ; //錯誤

                                     ^

StateErr1.java:7: error: reached end of file while parsing

}

^

11 errors

 

<<正確方式>>將上述敘述置於方法內

class State1 {

   int i = 50 ;

   int j =100 ;

   int t ;

   void add1() {

     t = i + j ; //內部區塊可使用外部區塊宣告之變數,見後述

     System.out.println("t ="+ (i + j)) ;

   }

}

 

<主類別>

class StateErr2 {

   int i = 70 ;

   int j =110 ;

   int t ;

   t = i + j ; //錯誤

   System.out.println("t ="+ (i + j)) ; //錯誤

   public static void main(String[] args) {

     int a = 11 ;

     int b = 22 ;

     int c ;

     c = a + b ; //正確

     System.out.println("c ="+ (a + b)) ; //正確

   }

}

編譯結果:

C:\js>javac StateErr2.java

StateErr2.java:5: error: <identifier> expected

t = i + j ; //錯誤

   ^

StateErr2.java:6: error: <identifier> expected

System.out.println("t ="+ (i + j)) ; //錯誤

                   ^

StateErr2.java:6: error: illegal start of type

System.out.println("t ="+ (i + j)) ; //錯誤

                     ^

StateErr2.java:6: error: ')' expected

System.out.println("t ="+ (i + j)) ; //錯誤

                         ^

StateErr2.java:6: error: ';' expected

System.out.println("t ="+ (i + j)) ; //錯誤

                           ^

StateErr2.java:6: error: <identifier> expected

System.out.println("t ="+ (i + j)) ; //錯誤

                             ^

StateErr2.java:6: error: <identifier> expected

System.out.println("t ="+ (i + j)) ; //錯誤

                                 ^

StateErr2.java:6: error: illegal start of type

System.out.println("t ="+ (i + j)) ; //錯誤

                                   ^

StateErr2.java:6: error: <identifier> expected

System.out.println("t ="+ (i + j)) ; //錯誤

                                   ^

StateErr2.java:6: error: ';' expected

System.out.println("t ="+ (i + j)) ; //錯誤

                                     ^

10 errors

 

<<正確方式>> 將上述敘述置於主方法內

class State2 {

public static void main(String[] args) {

  int i = 70 ;

  int j =110 ;

  int t ;

  t = i + j ; //正確

  System.out.println("t ="+ (i + j)) ; //正確

  int a = 11 ;

  int b = 22 ;

  int c ;

  c = a + b ; //正確

  System.out.println("c ="+ (a + b)) ; //正確

   }

}

執行結果:C:\js>java State2

t =180

c =33

 

[16-2-2 static方法內不可參照非static變數]

class StatErr3 {

   int i = 50 ;

   int j =100 ;

   int t ;

   public static void main(String[] args) {

     t = i + j ; //錯誤

     System.out.println("t ="+ (i + j)) ; //錯誤

   }

}

C:\js>javac StateErr3.java

StatErr3.java:6: error: non-static variable t cannot be referenced from a static

context

   t = i + j ; //錯誤

   ^

StatErr3.java:6: error: non-static variable i cannot be referenced from a static

context

   t = i + j ; //錯誤

       ^

StatErr3.java:6: error: non-static variable j cannot be referenced from a static

context

   t = i + j ; //錯誤

           ^

StatErr3.java:7: error: non-static variable i cannot be referenced from a static

context

   System.out.println("t ="+ (i + j)) ; //錯誤

                               ^

StatErr3.java:7: error: non-static variable j cannot be referenced from a static

context

   System.out.println("t ="+ (i + j)) ; //錯誤

                                   ^

5 errors

 

<正確方式>

<<1.建立物件>>

class State3 {

   int i = 50 ;

   int j =100 ;

   int t ;

   public static void main(String[] args) {

     State3 s3 = new State3() ;//建立自身類別物件

     s3.t = s3.i + s3.j ;

     System.out.println("t ="+( s3.i + s3.j)) ;

   }

}

執行結果:C:\js>java State3

t =150

 

<<2.使用static變數(見後述,其實意義是不一樣的)>>

宣告變數為static屬性時,主方法即可使用(因主方法之變數皆具static屬性)

class State4 {

   static int i = 50 ;

   static int j =100 ;

   static int t ;

   public static void main(String[] args) {

     t = i + j ; //和前述Ijt為同一變數

     System.out.println("t ="+ (i + j)) ;

   }

}

執行結果:C:\js>java State4

t =150

 

[16-2-3方法內不可宣告其他方法]

class StateErr4 {

   public static void main(String[ ] args) {

     int chChi = 85 ;

     int chEng = 75 ;

     int chPro = 65 ;

     int totScore ;

     void score31comDisp( ){       //方法內不可再有方法

        totScore = chChi + chEng + chPro ;  

        System.out.println ("張曉的總分數=" + totScore ) ;

      }

   }

}

編譯結果:

C:\js>javac StateErr4.java

StateErr4.java:7: error: illegal start of expression

       void score31comDisp( ){       //方法內不可再有方法

       ^

StateErr4.java:7: error: ';' expected

       void score31comDisp( ){       //方法內不可再有方法

                           ^

2 errors

arrow
arrow
    文章標籤
    java 物件導向 類別
    全站熱搜

    祈泊 發表在 痞客邦 留言(0) 人氣()