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 ; //和前述I、j、t為同一變數
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
留言列表