包(package)
包(package)用於將完成不同功能的類分類,放在不同的目錄(包)下。
包的命名
包的命名規則:將公司域名反轉作為包名。
包名一般每個字母都要小寫。
把類定義在某個包下面,一般在源文件開頭加上package xxx.yyy;
則類的全名是xxx.yyy.類名
如果定義類的時候沒有使用package指定包名,則Java認為類位於默認包里面(default package)。
編譯執行
如果程序中聲明了包名,即首行寫了package com.xxx;
那么如果按照一般的編譯方式 javac 源文件名.java
會在當前目錄下生成class文件。
然后直接用:java源文件名執行,則會報錯。
出現java.lang.NoClassDefFoundError
產生問題的原因
包的意義在於產生一種目錄結構,所以class文件必須位於相應的目錄層次結構中。
以package com.xxx為例:
一種解決方式是手工建立com文件夾,里面建立xxx文件夾,把生成的class文件放在目錄結構中,並且執行的時候采用java 完整類名(即帶上包名)才能夠執行。
不需要手動建立文件夾的解決手段
使用編譯參數 -d的解決方法:
編譯的時候可以在javac命令中采用-d指定存放生成的類文件的位置。
-d . 可以在當前目錄下生成。
用如下命令:
javac –d . 源文件名.java
則編譯后在當前目錄下,編譯器會生成包的文件目錄層次結構,並且把class文件放入其中。
如果不用“.”,也可以指定目錄。
用java命令執行的時候需要將包的信息全部帶上,即用完整的加包名的形式執行。
執行:
java 完整類名
子包
有兩個包名,分別是aa.bb.cc與aa.bb.cc.dd,那么我們稱后者為前者的子包。
導入
導入(import),將使用package分離的各個類導入回來,讓編譯器能夠找到所需要的類。
使用在同一個包下的類不需要導入可以直接用,使用不同的包下的類才需要導入。
使用格式:
import aaa.bbb.ccc;
可以使用通配符“*”代替類名,將包中的所有類導入:
import aaa.bbb.*;
注意:
import aaa.bbb.*;並不會導入import aaa.bbb.ccc包下面的類。
順序問題
關於package、import、class的順序問題:
1.首先需要定義包(package),可選;
2.接下來使用import進行導入,可選;
3.class或者interface的定義。
包導入與訪問權限
訪問權限修飾符有四類:
public:允許所有類訪問。
private:允許本類訪問。
protected:允許本類、子類、同一個包中的類訪問。
默認情況:即不加訪問修飾符的情況,允許本類和同一個包中的類訪問。
import相應的包之后只是使相應的類可見,是否可以訪問其中的成員還是由訪問修飾符所決定。如默認修飾的成員,即便將相應類的包導入,但是如果當前類不在同一個包中,還是不能訪問。