程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java編程那些事兒72——包的概念

Java編程那些事兒72——包的概念

編輯:關於JAVA

8.11 包的概念

隨著項目復雜度的增加,一個項目中需要實現的類和接口的數量也將快速增長,為了方便對於代碼的管理和閱讀,需要將這些類和接口按照一定的規則進行分類,這就是程序設計中命名空間(name space)概念出現的原因。

在Java語言中,為了對同一個項目中的多個類和接口進行分類和管理,專門設計了包(Package)的概念,使用包管理和類和接口。

其實出現包的概念最開始的原因是避免類名重復,現在這個作用也得到了廣泛的應用。例如各個公司會為同一個功能實現一套類,這些類名之間大量的存在重復,使用包的概念就可以很方便的解決類名重復的問題。

那麼包到底是什麼呢?其實包是一個邏輯的概念,就是給類名加了一個前綴,就像北京路這個路名上海和南京都有,再說這個路名時,就可以使用南京市北京路和上海市北京路進行區分,這裡的北京路就相當於類,而前面的前綴,如南京市或上海市,就相當於包名。

在物理上包被轉換成一個文件夾,操作系統通過文件夾來管理各個類和接口,從而實現對類的分類,或者稱之為按照類的功能對這些類進行封裝。

下面介紹一下和包有關的兩個語法:打包和引入包。

8.11.1 打包

打包的作用就是將聲明的類放入包中,也就是為類指定包名。在實際的項目中,一般根據類的功能來設定包,例如設置界面類包,邏輯類包,網絡類包等結構。

打包的語法格式為:

package 包名1[.包名2[.包名3……]];

在該語法中,包名可以設置多個,包名和包名之間使用“.”進行分割,包名的個數沒有限制。其中前面的包名包含後面的包名。按照Java語言的編碼規范,包名所有字母都小寫,由於包名將轉換為文件夾的名稱,所以包名中不能包含特殊字符。

例如:

package test;

package demo.chapter8;

package game.bubble.ui;

在示例中的最後一個,package game.bubble.ui,該包名將轉換為路徑\game\bubble\ui,也就是前面的包名是後面包名的父目錄。

需要特別注意的是:

1、打包的語句必須是程序代碼中的第一行可執行代碼,也就是說打包語句的上面只能包含空行或注釋。

2、打包的語句最多只有一句。

如果在代碼中沒有書寫package語句,則該類將被打入到默認包中,默認包無法被其它的包引用。

示例代碼:

//文件名:PackageClass.java

package chapter8;

public class PackageClass{

 //類內部的代碼

}

通過打包語法,可以為每個類增加一個前綴,也就是說以前使用類,使用類名即可,有了包名的概念以後,類的全名就是包名.類名了,通過在類名前面加入包名,可以使不同包中存在系統的類名,但是一般不建議一個項目中的類名存在重復。

當一個類有了包名以後,在編譯和運行時將和前面的操作產生一些變化,下面介紹一下JDK和Eclipse中相關操作的變化。

a)JDK編譯和運行打包的源文件

編譯源代碼的命令:javac –d 類文件路徑 源代碼名稱

例如:javac –d d:\ PackageClass.java

該命令的作用是將PackageClass類編譯成class,並將生成的class文件存儲到d盤根目錄下。則class文件的存儲路徑是:d:\chapter8\PackageClass.class。使用該命令編譯時自動將包名轉換為文件夾。

如果想將編譯生成的class文件生成在源代碼所在的目錄,則可以使用如下格式:javac –d . 源文件名

這裡的源文件沒可以使用*.java代表當前目錄下的所有源文件。

說明:執行javac命令必須將目錄切換到源代碼所在的目錄。

運行類文件的格式: java 包名.類名

例如:java chapter8.PackageClass

該命令的作用是運行該類,按照上面的編譯命令,運行該程序時,不應該切換到class文件所在的目錄,而是切換到最頂層的包名所在的目錄,所以執行以上命令時,在控制台下面只需要切換到d盤根目錄即可。

b)eclipe編譯和運行打包的源代碼

在新建源代碼時,可以在新建類向導中,可以在package欄中添加包名,在eclipse編譯時會自動生成包名的結構。

運行帶包名的代碼也和以前的運行步驟一樣。

需要特別注意的是:在eclipse中,源代碼的組織也要求將包名轉換為文件夾,否則將出現語法錯誤,這點在復制代碼到eclipse項目中時需要特別小心。

8.11.2 引入包

當類進行了打包操作以後,同一個包內部的類默認引入,當需要使用其它包中的類時,則必須首先引入對應的類,然後才可以使用該類。

引入包的語法格式為:

import 包名1.[.包名2[.包名3……]].類名|*;

在該語法中,import關鍵字後面是包名,包名和包名之間使用“.”分割,最後為類名或“*”,如果書寫類名則代表只引入該類,如果書寫星號則代表引入該包中的所有類、接口、異常和錯誤等。

例如:

import chapter8.*;

import java.io.*;

import chapter8. PackageClass;

引入包的代碼書寫在類聲明語句的上面,打包語句的下面,import語句在一個代碼中可以書寫任意多句,例如:

package chapter8;

import java.io.*;

import java.net.*;

public class Test{

 //其它代碼

}

說明:這裡的java.io包和java.net包都是JDK中提供的包名。

每引入一個類或接口,將在內存中占有幾十個字節的空間,所以使用星號引入一個包中所有的類或接口雖然編寫起來比較簡單,但是卻浪費了一些內存,而一個一個的引入類名編寫起來又比較麻煩。

小提示:使用eclipse中的source菜單下的Orgnize Imports可以將星號的引用轉換為對類名的引用。

最後需要特別注意的是,import只引入當前包下面的類,而不引入該包下面的子包裡面的類。例如:

//文件名:A.java

package a;

public class A{}

//文件名:B.java

package a.b;

public class B{}

//文件名:Test.java

import a.*;

public class Test{

 public static void main(String[] args){

  B b = new B();   //語法錯誤,B類未引入

 }

}

說明:在該示例的Test類中,使用import a.*;引入了包a中的所有類,也就是類A,而包a的子包a.b中的類將不會被引入,所以在Test類中使用B類將出現語法錯誤。

8.11.3 包的概念小結

總之,包的概念(也就是命名空間)使得類名沖突的問題獲得良好的解決,另外也可以使用包來分類管理一個項目中的多個類,使得項目中的類數量比較多時,結構顯得比較清晰。

到現在為止,綜合以前學習的所有語法知識,規范的類結構的代碼如下:

/*

* 版權信息

*/

打包語句

引入語句

/**

* 類注釋

*/

類聲明

JDK中的源代碼代碼(位置在JDK安裝目錄下的src.zip中)均以這樣的格式組織類,這也是規范編寫類結構代碼的基礎。

8.12 總結

面向對象(OO)是一種思想,該思想通過改變數據和功能的組織方式,從而徹底改變了整個項目中代碼的結構,也使得每個類的功能單純,從而極大的降低了項目的復雜度,使得項目開發更方便的進行模塊化,從而可以為開發更復雜的項目提供了機會。

本章雖然使用了不少的篇幅來介紹面向對象的知識,但是這些還只是一些基礎,更多的知識需要在實際的編程實踐中去進行體會。

當掌握了本章的知識以後,就可以比較輕松的去閱讀更專業的面向對象知識的書籍,比如面向對象理論以及設計模式相關的書籍,從而提高對於面向對象的認識。

面向對象的知識就介紹這麼多,將在下一章中介紹JDK中類文檔的使用,並結合文檔的使用介紹如何使用JDK中提供的類,從而進入Java開發技術的學習。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved