官术网_书友最值得收藏!

2.4 Java源文件結構

Java語言的源程序代碼由一個或多個編譯單元(Compilation uni t)組成,每個編譯單元只能包含下列內容(空格和注釋除外),如表2-1所示。

表2-1 Java源文件結構

注意:

(1)需要特別注意的是, Java是嚴格區分大小寫的。

(2)定義為public的類名必須與Java文件名稱完全一致,每個Java源文件只能有一個定義為public的類,但可以有幾個非public的類名。

2.4.1 知識準備:package語句

在大型項目開發中,為了避免類名的重復,經常使用“包”來組織各個類。例如,公司用開發了一個類Food,公司乙也開發了一個類Food,現在需要同時用到這兩個類,為了將這兩個類區分開來,將這兩個文件放在兩個不同的目錄下。那么,在使用的時候如何準確地找到需要的類呢?這就需要用到“包(package)”這個概念。

在Java程序中可以用package來指明這兩個類的引用路徑:將甲公司開發的Student類放到一個包(package)中,而將乙公司開發的Student類放到另一個包(package)中。為了避免不同的公司之間類名的重復,Sun建議使用公司Internet域名的倒寫來當做包名,例如,使用域名 farsight.com.cn的倒寫 cn.com.farsight來作為包的名稱。如果現在有一個名為Student的類,將它放到目錄cn\com\farsight下,然后再在程序中加入如下語句:

    package cn.com.farsight;

這樣,這個類就可以和其他的名稱為Student的類區分開了。

package語句的基本語法如下:

    package  <top_pkg_name> [ .<sub_pkg_name>] * ;

在同一個項目組中,經常用功能或模塊的名稱來作為子包名,例如,現在開發一個學員管理系統,一個用于華清遠見的管理模塊,一個用于清華附中的管理模塊,這兩個功能模塊中均有一個Student的類,這時可以將華清遠見管理模塊中使用的Student 放到cn\com\farsight\college目錄下,而將清華附中管理模塊的Student類放到cn\com\farsight\school中,這樣,這兩個文件就不會沖突了。

注意,當將開發的類放到包中時,必須將類的源文件放到與包名的元素相一致的目錄結構中,就如上面的學生類 Student,如果在文件中加入了package語句:package cn.com.farsight,則必須將這個Student類文件放到cn\com\farsight目錄下。在磁盤目錄結構中,使用“\”(Windows)或“/”(Unix/Linux/BSD)來分隔各個層級的目錄,而在Java類文件中,使用“.”來分隔包的層次。

Java的核心包都放在Java包及其子包中,而將很多擴展包放在javax包及其子包中。在Java 核心包中,也有一些重復的類名,就是通過不同的包來區分的,例如,在java.sql包中,有一個Date類,而在java.util中,也有一個Date類。通過將它們放在不同的包中,就可以區分這兩個類。

一般來說,如果在程序中使用package 將程序打包,則將程序放到對應的目錄下,這樣,才不違背package的設計初衷。如果將類的源文件(.java文件)都放到同一個路徑下,只是將編譯后的class文件放到不同的目錄下,上面提到的文件名沖突的問題依然存在(同一個路徑下不允許兩個文件同名),因此,需要將源文件保存在不同的路徑中。這時,可以使用如下命令來編譯文件:

    javac cn\com\farsight\college\Student.java

在cn目錄的上一級目錄下執行上述命令。

如果程序是一個帶main方法的應用程序,可以在cn目錄的上一級目錄下執行這個文件,命令如下:

    java cn.com.farsight.college.Student

注意編譯和執行時的分隔符。因為在編譯時,需要指明的是文件的路徑,所以使用“\”來分隔;而在執行類文件時,需要指明的是包名稱,所以使用“.”來分隔。

下面來看一個使用package的例子。

源文件:Student.java

    package cn.com.farsight;
    public class Student {
    // 定義屬性
    private String studentId;
    // 定義屬性“studentId”的設置方法
    public void setStudentId(String student_Id) {
        studentId = student_Id;
    }
    // 定義屬性“studentId”的獲取方法
    public String getStudentId() {
        return studentId;
    }
    }

這個程序最好放在路徑cn\com\farsight下,然后再在cn的上一層路徑執行如下的指令編譯程序:

    javac cn\com\farsight\Student.java

而被編譯后的class文件必須放置在cn\com\farsight路徑下,這樣才可以成功地被其他程序引用。

如果Student是一個應用程序(有一個main()方法),那么,為了執行這個程序,必須在“cn”的上一級目錄執行如下的指令:

    java cn.com.farsight.Student

2.4.2 知識準備:import語句

在編譯器定位你所創建的類所訪問的其他類的過程中,包(package)扮演了重要的角色。當編譯器碰到一個類對另一個類的引用時,它會在當前的包中和設置的CLASSPATH中尋找這個類,以檢查這個類是否能在這些路徑中找到。

import語句應該出現在package語句之后(如果有的話),類的定義之前。package語句只能有一個,但是import語句可以有多個。

可以使用import來引入包中的一個類,也可以用import來引入指定包中的所有類。

import語句的基本語法如下:

    import  <pkg_name>[.<sub_pkg_name>].<class_name>;

    import <pkg_name>[.<sub_pkg_name>].*;

□引入一個類:

    import cn.com.farsight.college.Student

□引入指定包中的所有類使用通配符“*”:

    import cn.com.farsight.college.*

這樣就可以引入包cn.com.farsight.college中的所有類。

這兩種方式對于引入相應的類并沒有什么區別。但是,如果只是需要一個包中有限的幾個類,建議采用第一種方式(寫明引入的類名)會讓人一目了然。另外,需要注意的是,通過import引入包中的類的時候,它并不會遞歸地執行引入動作,比如,通過下面的語句:引入了cn.com.farsight 這個包中的所有類,但它并不會引入cn.com.farsight.school和cn.com.farsight.colleage中的類。要使用這兩個包中的類,還需要將它們使用“import”語句分別引入。

    import cn.com.farsight.*;

Java編譯器默認為所有的Java程序引入了JDK的java.lang 包中所有的類(import java.lang.*;),其中定義了一些常用類:System、String、Object、Math等。因此可以直接使用這些類而不必顯式引入。但使用其他非無名包中的類則必須先引入、后使用。

另外,可以通過在類名前加上不同的限制符,如public等來控制類的適用范圍。關于這些限制符及相應的使用范圍,將在后續章節介紹。

注意:

使用import并不會將相應的類或者包加載到class文件(或者Java源文件),也不會包含到Java源文件(或者class文件)中,它的作用僅僅是對需要用到的類進行定位(location)。它表示程序中用到某個類的時候,如果沒有在類前指定包名,應該到當前目錄或者import指定的包中去尋找(注意java.lang包是默認引入的)。

2.4.3 任務二:package語句和import語句實例

1.任務描述

編寫一個Parent類,在構造方法中輸出“我是parent”,放在parent 包中,編寫一個Child類,在構造方法中輸出“我是child”放在child包中,child包是parent包的子包。使用package語句生成包,并使用import引用子包。

2.技能要點

□ 掌握包的創建和使用。

□ 通過給包命名創建包的層次。

3.任務實現過程

(1)在scr默認包中創建parent包,在此包中創建Parent類,不帶參數,在構造方法中輸出“I am a parent”。

(2)創建parent的子包parent.child包,在此包中創建Child類,不帶參數,在構造方法中輸出“I am a child ”。

(3)在Parent類中使用import語句引入parent.child包,并創建Parent類和Child類對象,實現輸出。

    Parent.java
    package parent;
    import parent.child.Child;
    public class Parent {
    public Parent(){
        System.out.print("I am a parent");
    }
    public static void main(String[] args) {
        Child c = new Child();
        Parent p = new Parent();
    }
    }
    Child.java
    package parent.child;
    public class Child {
    public Child(){
        System.out.print("I am a child \n");
    }
    }

運行結果:

    I am a child
    I am a parent
主站蜘蛛池模板: 寻乌县| 合山市| 历史| 富阳市| 原平市| 景谷| 庄浪县| 岳普湖县| 府谷县| 广灵县| 兰坪| 济阳县| 四子王旗| 台山市| 奉新县| 泰顺县| 临澧县| 阳朔县| 嘉兴市| 宜兰县| 上思县| 宜黄县| 石嘴山市| 香港 | 海淀区| 鹤峰县| 陵水| 宁河县| 太保市| 察哈| 咸宁市| 兴仁县| 百色市| 莒南县| 乡宁县| 凤阳县| 辉县市| 新田县| 浦江县| 凤台县| 邵阳市|