1.爲什麼需要包(package):
如果所有源文件都寫在當前目錄下,如果出現同名的文件就會出錯,所以我們使用包package將他們層次分開
2.編譯帶包的java原文件後怎麼運行編譯出的.class文件
當我編譯一個帶包聲明class A,即使我們cd到包目錄下也無法運行這個編譯後的字節碼文件,這是因爲在編譯後這個類名字已經不再是A 而是帶包申明的A,例如cn.jxau.cl.A;當我們cd到包下運行java A;這樣名字名字類A與cn.jxau.cl.A不匹配就找不到,
而我們在包下運行java cn.jxau.cl.A,也是不行的,因爲這個是名字的同時也是一個路徑,java回去包目錄下的/cn/jxau/cl找字節碼文件它總的路徑變成了/cn/jxau/cl/cn/jxau/cl,這下面並沒有A字節碼文件。
所以我麼只能在跟目錄下運行java cn.jxau.cl.A,這樣既通過路徑找到A字節碼文件,切裏面存放的又是名爲cn.jxau.cl.A的類符合這兩個條件。
3. 學習過程中碰到過這樣一個問題,在源文件存在的情況下,使用import cn.jxau.cl.A是可以的,而使用import cn.jxau.cl.*可能會出錯
這個原因要從這兩種導包的原理說起:
Java中有兩種包的導入機制:
單類型導入(single-type-import),例如import java.io.File:因爲包名和文件名都已經確定,可以一次性查找定位到。
按需類型導入(type-import-on-demand),例如import java.io.*:編譯器會把包名和文件名進行排列組合,然後對所有的可能性進行類查找定位。
例如:package com;
import java.io.*;
import java.util.*;
當你的類文件中使用到了File類,那麼File可能會出現在以下幾個地方:
1 File File沒有package語句,編譯器首先搜索無名包。問題就出現在這裏,它找到了與類名相同的.java文件就會報不是.class文件錯誤
2 com.File File類屬於當前包。
3 java.lang.File 自動導入
4 java.io.File
5 java.util.File
另外需要注意的是,上面的第4種情況下,編譯器找到java.io.File後並不會停止下一步的搜尋,而是把所有的可能性都查找完以確定沒有類衝突,如果有類衝突,則會報錯,刪除不用的類後再編譯。假使此時的頂層路徑有3個,編譯器則會進行3*5=15次查找