Java基礎總結 - 包(package)

Java基礎總結 - 包(package)
這篇文章只是把大學記的筆記整理到博客,方便自己查看,不保證權威性(•̀ᴗ•́)و ̑̑

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次查找

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章