19   Java的程式檔構成

[19-1 Java的程式檔]

目前為止我們看到的Java程式檔有兩種,存放原始碼的檔案及存放位元碼的檔案。原始碼檔以「記事本」編輯,須指定副檔名為.java;原始碼經編譯後成為位元碼檔,副檔名自動生成為.class

  

[19-2類別與原始碼檔、位元碼檔]

類別(class)

Java的基礎是類別(class),可分為主類別和一般類別,程式由主類別的主方法開始執行,一般類別不可單獨執行,必須建立物件直接或間接經由主類別呼叫執行。不論主類別或一般類別都可為公開類別或非公開類別。(public修飾子將於「存取權限控制章節」說明)

原始碼檔(source code file)

一個Java原始碼檔可包含一個或多個類別,原始碼檔之副檔名為.java

<單一類別檔案>

一個原始碼檔只包含一個主類別或一般類別。

主類別或一般類別皆可為公開或非公開類別。

如為公開類別時,檔案名稱須和公開類別名稱一致。

<複數類別檔案>

一個原始碼檔包含多個主類別或一般類別。

複數類別檔案可以都為主類別,或都為一般類別,或兩者皆有。

複數類別檔案可以都為非公開類別。

複數類別檔案只能有一個公開類別。

複數類別檔案只能有一個公開主類別,如有多個主類別時皆不可為公開類別。

複數類別檔案如包含主類別,而要有公開類別時,就只能以主類別為公開類別。

含公開類別時,須以公開類別名稱為檔名。

位元碼檔(byte code file)

原始碼檔經編譯後,每一個類別自成一個位元碼檔,皆以類別名稱為檔名,.class為副檔名。

 圖19-1

圖19-2

 

原始碼檔種類整理:

<單一類別>

類別數

/一般類別

公開/非公開

類別名

原始碼檔名

位元碼檔名

單一

主類別

公開

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

 

arrow
arrow
    創作者介紹
    創作者 祈泊 的頭像
    祈泊

    祈泊的部落格

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