- Android系統下Java編程詳解
- 鄭萌等編著
- 2411字
- 2019-01-09 15:14:20
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
- 現代C++編程:從入門到實踐
- The Supervised Learning Workshop
- Scala Design Patterns
- Programming ArcGIS 10.1 with Python Cookbook
- Python時間序列預測
- Building Serverless Applications with Python
- Python數據結構與算法(視頻教學版)
- Unity 2017 Mobile Game Development
- 用戶體驗可視化指南
- Julia 1.0 Programming Complete Reference Guide
- Python大規模機器學習
- Visual Basic程序設計實驗指導及考試指南
- Clojure編程樂趣
- Hands-On ROS for Robotics Programming
- 計算思維與Python編程