3 Java程式的長相
Java程式的基本單位是類別(class),一個類別(X)可以呼叫使用其他類別(A、A1),一個類別(A)可以被延用並擴展為其他類別(A1、A2)。
[3-1類別]
※類別是Java程式碼的集合。
※類別成員有field(稱為欄位或資料或變數)及method(稱為方法或操作或函式)。
※具有名稱為main之方法的類別,稱為主類別,可單獨執行。非主類別的類別(將稱為一般類別)必須由主類別呼叫使用。一般類別亦可呼叫使用其他主類別或一般類別。
格式:[ public|abstract|final ] class 類別名稱 {
欄位(Field)宣告
方法(Method)宣告
}
下面類別的範例為本資料的第一支程式,一般坊間書本的第一支程式總是一成不變的列印顯示"Hello world!",筆者特以抄來之論語學而篇文章的第一句英譯,將之列印顯示出來,希望大家抱持此一心態來學習Java程式語言。
<例>類別
public class ConfucianAnalects{ //定義類別,名稱為ConfucianAnalects
static String header = "學而篇"; //定義欄位,名稱為header
public static void main(String[] args){ //main方法
System.out.println(header); //列印變數內容並改行
System.out.print("Is it not pleasant to learn with a "); //顯示""中的文字
System.out.println("constant perseverance and application!?");
}
}
說明:
※class為關鍵字,宣告定義一個類別,其後接類別名稱ConfucianAnalects。
※類別名稱常由有意義之文字組成,習慣上各單字的第一個字母使用大寫。
※定義靜態字串欄位header,初期值為"學而篇"。
※方法名稱為main,本類別含main方法,故為主類別,為可執行之類別。
※Java程式由主類別之main方法開始執行。
※public表示本類別或方法可被其他類別或物件存取使用,後面章節會再說明。
※//起至行末為註解,編譯程式不視為有效程式碼。另有可跨行之註解方式---
/* */。
※System.out.print為內建物件之方法,會列印顯示""中的文字,列印後不跳行,
※System.out.println則為列印後不跳行。
※外層{}內為類別之內容,內層{}為方法之內容。一般{}採內縮式較為明確,但無強制規定。
※每一敘述式皆以;結束。
※本類別沒有欄位宣告。
(註:如無特別標明,本資料之原始碼檔將放置於C槽的js資料夾,於命令提示字元下執行時,需以cd命令切換至該資料夾下)
使用記事本軟體將上述程式碼編輯儲存至C槽之js資料夾,副檔名為.java。
在命令提示字元上執行:
Windows 7:開始>所有程式>附屬應用程式>命令提示字元
C:\Users\CTC-Mobile>
切換目錄至原始碼檔所在目錄:C槽之js資料夾
C:\Users\CTC-Mobile>cd C:\js
沒特別指定時,由目前資料夾取出原始碼檔,編譯(javac)類別ConfucianAnalects,須指定副檔名.java。沒特別指定時,位元碼檔存放至原始碼檔同一資料夾
C:\js>javac ConfucianAnalects.java
執行(java)類別ConfucianAnalects,不須指定副檔名.class
C:\js>java ConfucianAnalects
學而篇
Is it not pleasant to learn with a constant perseverance and application!?
[3-1-1主類別及一般類別]
凡是含主方法(名稱為main之方法)之類別稱為主類別,可單獨執行。一般類別不含主方法,不可單獨執行,必須透過主類別建立其物件,並呼叫其方法執行。主類別也可以被另一主類別呼叫建立物件執行。
[3-1-2類別的成員]
類別成員包含欄位及方法。
[欄位field]
欄位為程式執行時存放資料的地方,有各種型態,如整數、浮點數等。
[方法method]
方法為程式進行進行運算及操作(如列印顯示)的地方。
<例>主類別
計算兩數y、z之和x,並顯示於命令列。
class Disp1 { //以關鍵字class宣告類別disp1
public static void main(String[] args) { //方法(函式)宣告,本例為主方法
int x, y, z; //整數欄位x、y、z宣告
y = 10; //指定運算
z = 15; //指定運算
x = y + z; //加法及指定運算
System.out.println("x的值是" + x); //呼叫系統內建類別的方法(函式)
} //(主)方法結束
} //(主)類別結束
命令提示字元下輸入:
C:\js>java Disp1
執行結果:x的值是25
<例>一般類別
class Disp2 { //以關鍵字class宣告類別disp2
int m = 11, n = 12; //欄位宣告並指定其值(指定運算)
void dispMethod2() { //方法宣告,本例為一般方法
System.out.println("m+n="+ (m+n)); //呼叫系統內建類別的方法(函式)
} //(一般)方法結束
} //(一般)類別結束
一般類別不可單獨執行。
<例>主類別+一般類別
class Disp3g {
int m = 15, n = 22; //欄位宣告並指定其值(指定運算)
void dispMethod3() { //(一般)方法宣告
System.out.println("m+n=" + (m+n)); //呼叫系統內建類別的方法(函式)
}
}
class MainDisp3m {
public static void main(String[] args) { //方法(函式)宣告
Disp3g dd = new Disp3g(); //建立類別disp3g之物件dd
dd.m = 27; //物件欄位運算
dd.n = 12; //物件欄位運算
dd.dispMethod3(); //呼叫物件方法
}
}
命令提示字元下輸入:C:\js>java MainDisp3m
執行結果:m+n=39
說明:
[註解行說明]
//開始直到行末為註解行,編譯器將不視為程式碼。
/* */圍住範圍為註解行,可跨行,編譯器亦不視為程式碼。
[內建類別System的方法]
System.out.println:顯示列印後改行,下一列印由新行開始列印。
System.out.print:顯示列印後不改行,下一列印接續原行列印。
格式:
System.out.println(n1+n2+n3+…..)
n1、n2、n3可為文字(需置於" "內)或變數或計算式(需置於()內)或方法(有回傳值)等,方法時為列印回傳值。
+號為連接之意,即n1、n2、n3等視為字串連成一大字串。
後續將陸續出現System.out.println及System.out.print範例。
[3-2物件]
如果將類別視為藍圖,則物件即為依據藍圖所建築的房子,或所造的機器等,可造出複數個。藍圖可視為不占空間,但房子、機器等則占有龐大空間,如前述,類別(主類別亦可)建立物件後會分配記憶體給欄位,一個類別可建立多個物件,並各自配置有記憶體,不會互相干擾。
建立物件格式:
類別物件名稱 = new 類別([建構子參數列]);
或
類別物件名稱;
物件名稱 = new 類別([建構子參數列]);
[註:因建構子名稱和類別一樣,也有人直接將上式底線部分直接稱為建構子]
例:obj1 xx = new obj1(); //建立類別obj1的物件xx,沒有建構子參數
或
obj1 xx;
xx = new obj1(); //建構子於後述章節說明
<例>物件
class Obj1 {
int m = 15, n = 22;
void objMethod1() {
System.out.println("m+n=" + (m+n));
}
}
class MainObj1 {
public static void main(String[] args) {
Obj1 xx = new Obj1(); //建立類別obj1之物件xx
Obj1 yy = new Obj1(); //建立類別obj1之物件yy
xx.m = 27; //物件欄位運算
yy.m = 30;
xx.n = 12; //物件欄位運算
xx.objMethod1(); //呼叫xx物件方法
yy.objMethod1(); //呼叫yy物件方法
}
}
命令提示字元下輸入:C:\js>java mainObj1
執行結果:m+n=39
m+n=52
[3-3靜態(static)類別、非靜態(non-static)類別]
主類別因具static主方法,為靜態類別,不需建立物件即可執行,其他非靜態類別則須建立物件才可執行。靜態方法內之欄位(資料)為靜態欄位,說明見後述。
[3-4繼承]
類別是Java程式的基本單位,繼承則是Java程式的重要的功能。類別可透過繼承擴充或改變功能,被繼承之類別稱為父類別,繼承的類別稱為子類別。父類別及子類別皆可分別建立一個或多個物件。繼承使用extends關鍵字。
格式:
class 子類別(新類別) extends 父類別(既存類別){覆寫、新增欄位及方法等}
<例>繼承
class Father1 { //父類別(既存類別)
int x = 7;
char y = 'a';
void fatherMethod1( ) {
System.out.println(y + "=" + x) ; } }
class Son1 extends Father1 { } //子類別單純繼承(不改變父類別)
class Son2 extends Father1 { //繼承並覆寫方法
void fatherMethod1() {
System.out.println("son2 x=" + x + " y=" + y); } }
class Son3 extends Father1 { //繼承並增加功能,原欄位及方法仍保留
int z = 100; //新增欄位z
void fatherMethod2() { //新增方法fatherMethod2
System.out.println("son3 x=" + x + " y=" + y + " z=" + z); } }
class MainExtends1 {
public static void main(String[ ] args) {
Father1 A = new Father1( ) ;
A.fatherMethod1();
Son1 B = new Son1();
B.fatherMethod1();
Son2 C = new Son2();
C.fatherMethod1();
Son3 D = new Son3();
D.fatherMethod1();
D.fatherMethod2(); } }
命令提示字元下輸入:C:\js>java mainExtends1
執行結果:a=7
a=7
son2 x=7 y=a
a=7
son3 x=7 y=a z=100
說明:
繼承後基本上子類別將保有原父類別上所有功能,包括欄位及方法,並可覆蓋及新增欄位及方法。
[3-5關鍵字或稱保留字]
關鍵字為Java保留為系統使用,有其特殊意義,不得用於類別、物件、欄位等名稱。如下列:
abstract、case、class、const、default、do、else、extends、false、final、
friend、implements、interface、native、private、protected、public、return、
shift、static、super、synchronized、this、throw、throws、true、try、virtual、
void、volatile。
保留字可能會因新舊版本而有增減。
<再論命令提示字元使用方式>
Java原始碼可以記事本編輯,儲存時副檔名指定為.java,經命令提示字元畫面輸入編譯指令javac,成為副檔名.class之位元檔後,即可用java命令執行。
進入:開始功能表->所有程式->附屬應用程式->命令提示字元
C:\Users\CTC-Mobile> (各人顯示皆不同)
切換至java程式原始碼所在資料夾(cd命令,資料夾為C:\js)
C:\Users\CTC-Mobile>cd C:\js
編譯:輸入java程式編譯指令javac,原始碼須指定副檔名.java
C:\js>javac Disp1.java
執行:輸入java程式執行指令java,位元碼不須指定副檔名.class
C:\js>java Disp1
x的值是25 //輸出
本章節說明Java的大概樣子,下一章起進入詳細說明。
留言列表