19 Java的程式檔構成
[19-1 Java的程式檔]
目前為止我們看到的Java程式檔有兩種,存放原始碼的檔案及存放位元碼的檔案。原始碼檔以「記事本」編輯,須指定副檔名為.java;原始碼經編譯後成為位元碼檔,副檔名自動生成為.class。
[19-2類別與原始碼檔、位元碼檔]
類別(class)
Java的基礎是類別(class),可分為主類別和一般類別,程式由主類別的主方法開始執行,一般類別不可單獨執行,必須建立物件直接或間接經由主類別呼叫執行。不論主類別或一般類別都可為公開類別或非公開類別。(public修飾子將於「存取權限控制章節」說明)
原始碼檔(source code file)
一個Java原始碼檔可包含一個或多個類別,原始碼檔之副檔名為.java。
<單一類別檔案>
一個原始碼檔只包含一個主類別或一般類別。
主類別或一般類別皆可為公開或非公開類別。
如為公開類別時,檔案名稱須和公開類別名稱一致。
<複數類別檔案>
一個原始碼檔包含多個主類別或一般類別。
複數類別檔案可以都為主類別,或都為一般類別,或兩者皆有。
複數類別檔案可以都為非公開類別。
複數類別檔案只能有一個公開類別。
複數類別檔案只能有一個公開主類別,如有多個主類別時皆不可為公開類別。
複數類別檔案如包含主類別,而要有公開類別時,就只能以主類別為公開類別。
含公開類別時,須以公開類別名稱為檔名。
位元碼檔(byte code file)
原始碼檔經編譯後,每一個類別自成一個位元碼檔,皆以類別名稱為檔名,.class為副檔名。
原始碼檔種類整理:
<單一類別>
類別數 |
主/一般類別 |
公開/非公開 |
類別名 |
原始碼檔名 |
位元碼檔名 |
單一 |
主類別 |
公開 |
PM1 |
PM1.java |
PM1.class |
單一 |
主類別 |
公開 |
PM2 |
PM2xy.java |
編譯錯誤 |
單一 |
主類別 |
非公開 |
NM3 |
NM3.java |
NM3.class |
單一 |
主類別 |
非公開 |
NM4 |
NM4xy.java |
NM4.class |
單一 |
一般類別 |
公開 |
PG5 |
PG5.java |
PG5.class |
單一 |
一般類別 |
公開 |
PG6 |
PG6xy.java |
編譯錯誤 |
單一 |
一般類別 |
非公開 |
NG7 |
NG7.java |
NG7.class |
單一 |
一般類別 |
非公開 |
NG8 |
NG8xy.java |
NG8.class |
<複數類別>
類別數 |
主/一般類別 |
公開/非公開 |
類別名 |
原始碼檔名 |
位元碼檔名 |
複數 |
主類別 |
公開 |
PM9 |
PM9 |
編譯錯誤 2公開類別 |
主類別 |
公開 |
PM10 |
|||
複數 |
主類別 |
公開 |
PM11 |
PM11xy |
同上及檔名錯誤 |
主類別 |
公開 |
PM12 |
|||
複數 |
主類別 |
非公開 |
NM13 |
NM13 |
NM13 |
主類別 |
非公開 |
NM14 |
NM14 |
||
複數 |
主類別 |
非公開 |
NM15 |
NM15xy |
NM15 |
主類別 |
非公開 |
NM16 |
NM16 |
||
複數 |
主類別 |
公開 |
PM17 |
PM17 |
PM17 |
主類別 |
非公開 |
NM18 |
NM18 |
||
複數 |
主類別 |
公開 |
PM19 |
PM19xy |
應以公開類別名為檔名 |
主類別 |
非公開 |
NM20 |
|||
複數 |
一般類別 |
公開 |
PG21 |
PG21 |
編譯錯誤 2公開類別 |
一般類別 |
公開 |
PG22 |
|||
複數 |
一般類別 |
公開 |
PG23 |
PG23xy |
同上及檔名錯誤 |
一般類別 |
公開 |
PG24 |
|||
複數 |
一般類別 |
非公開 |
NG25 |
NG25 |
NG25 |
一般類別 |
非公開 |
NG26 |
NG26 |
||
複數 |
一般類別 |
非公開 |
NG27 |
NG27xy |
NG27 |
一般類別 |
非公開 |
NG28 |
NG28 |
||
複數 |
一般類別 |
公開 |
PG29 |
PG29 |
PG29 |
一般類別 |
非公開 |
NG30 |
NG30 |
||
複數 |
一般類別 |
公開 |
PG31 |
PG31xy |
應以公開類別名為檔名 |
一般類別 |
非公開 |
NG32 |
|||
複數 |
主類別 |
公開 |
PM33 |
PM33 |
編譯錯誤 2公開類別 |
一般類別 |
公開 |
PG34 |
|||
複數 |
主類別 |
公開 |
PM35 |
PM35xy |
同上及檔名錯誤 |
一般類別 |
公開 |
PG36 |
|||
複數 |
主類別 |
非公開 |
NM37 |
PM37 |
NM37 |
一般類別 |
非公開 |
NG38 |
NG38 |
||
複數 |
主類別 |
非公開 |
NM39 |
NM39xy |
NM39 |
一般類別 |
非公開 |
NG40 |
NG40 |
||
複數 |
主類別 |
公開 |
PM41 |
PM41 |
PM41 |
一般類別 |
非公開 |
NG42 |
NG42 |
||
複數 |
主類別 |
公開 |
PM43 |
PM43xy |
應以公開類別名為檔名 |
一般類別 |
非公開 |
NG44 |
|||
複數 |
主類別 |
非公開 |
NM45 |
NM45 |
應以主類別為公開類別 |
一般類別 |
公開 |
PG46 |
|||
複數 |
主類別 |
非公開 |
NM47 |
NM47xy |
應以主類別為公開類別 |
一般類別 |
公開 |
PG48 |
註:原始碼檔之副檔名為(.java),位元碼檔之副檔名為(.class)
以下羅列部分範例:
<單一公開主類別>含公開主類別的原始碼檔名必須為主類別名
public class PM1{ //檔名PM1.java
public static void main(String[] args){
System.out.println("單一公開主類別PM1");
}
}
編譯及執行:
C:\js>javac PM1.java
C:\js>java PM1
單一公開主類別PM1
<單一公開主類別>含公開主類別的原始碼檔名必須為主類別名
public class PM2{ //檔名PM2xy.java,編譯錯誤
public static void main(String[] args){
System.out.println("單一公開主類別PM2");
}
}
編譯及執行:
C:\js>javac PM2xy.java
PM2xy.java:1: error: class PM2 is public, should be declared in a file named PM2
.java
public class PM2{
^
1 error
<單一非公開主類別>
class NM3{ //檔名NM3.java
public static void main(String[] args){
System.out.println("單一非公開主類別NM3");
}
}
編譯及執行:
C:\js>javac NM3.java
C:\js>java NM3
單一非公開主類別NM3
<單一非公開主類別> 非公開主類別原始檔名可為任意名稱
class NM4{ //檔名NM4xy.java
public static void main(String[] args){
System.out.println("單一非公開主類別NM4");
}
}
編譯及執行:
C:\js>javac NM4xy.java
C:\js>java NM4
單一非公開主類別NM4
<單一公開一般類別> 須以公開類別名稱為檔名
public class PG5{ //檔名PG5.java
void method5(){
System.out.println("單一公開一般類別PG5");
}
}
編譯及執行:
C:\js>javac PG5.java
(編譯無誤)
<單一公開一般類別>須以公開類別名稱為檔名
public class PG6{ //檔名PG6xy.java,編譯錯誤
void method6(){
System.out.println("單一公開一般類別PG6");
}
}
編譯及執行:
C:\js>javac PM6xy.java
PG6xy.java:1: error: class PG6 is public, should be declared in a file named PG6
.java
public class PG6{ //檔名PG6xy.java
^
1 error
<單一非公開一般類別> 非公開類別,其原始檔名可為任意名稱
class NG7{ //檔名NG7.java
void method7(){
System.out.println("單一非公開一般類別NG7");
}
}
編譯及執行:
C:\js>javac NG7.java
(編譯無誤)
<單一非公開一般類別> 非公開類別,其原始檔名可為任意名稱
class NG8{ //檔名NG8xy.java
void method8(){
System.out.println("單一公開一般類別NG8");
}
}
編譯及執行:
C:\js>javac NG8xy.java
(編譯無誤)
<複數公開主類別>
public class PM9{ //檔名PM9.java,編譯錯誤
public static void main(String[] args){
System.out.println("複數公開主類別PM9");
}
}
public class PM10{
public static void main(String[] args){
System.out.println("複數公開主類別PM10");
}
}
編譯及執行:
C:\js>javac PM9.java
PM9.java:6: error: class PM10 is public, should be declared in a file named PM10
.java
public class PM10{
^
1 error
<複數非公開主類別>可編譯及各自執行
class NM13{ //檔名NM13.java
public static void main(String[] args){
System.out.println("複數非公開主類別NM13");
}
}
class NM14{
public static void main(String[] args){
System.out.println("複數非公開主類別NM14");
}
}
編譯及執行:
C:\js>javac NM13.java
C:\js>java NM13
複數非公開主類別NM13
C:\js>java NM14
複數非公開主類別PM14
<公開+非公開主類別>可編譯及各自執行
public class PM17{ //檔名PM17.java
public static void main(String[] args){
System.out.println("公開+非公開主類別PM17");
}
}
class NM18{
public static void main(String[] args){
System.out.println("公開+非公開主類別NM18");
}
}
編譯及執行:
C:\js>javac PM17.java
C:\js>java PM17
公開+非公開主類別PM17
C:\js>java NM18
公開+非公開主類別NM18
<複數公開一般類別>編譯錯誤
public class PG21{ //檔名PG21.java
void method21(){
System.out.println("複數公開一般類別PG21");
}
}
public class PG22{
void method22(){
System.out.println("複數公開一般類別PG22");
}
}
編譯及執行:
C:\js>javac PG21.java
PG21.java:6: error: class PG22 is public, should be declared in a file named PG2
2.java
public class PG22{
^
1 error
留言列表