0.1)本文轉自 core java volume 1, 旨在理清 包和類導入的相關知識;
1.1) java 允許使用包將類組織起來,包可以方便組織代碼,并將自己的代碼與別人提供的代碼庫分開管理;
1.2) 標準的java 類庫分別在多個包中, 包括 java.lang、java.util 和java.net;所有標準的 java 包都處于java 和 javax 包層次中;
1.3) 使用包的主要原因是確保類名的唯一性;且為了保證包名的絕對唯一,Sun 公司建議將公司的因特網域名以逆序的形式作為包名;
2.1)一個類可以使用所屬包中的所有類,以及其他包中的共有類;
2.2)我們可以采用兩種方式訪問另一個包中的公有類:
Attention)需要注意的是, 只能使用星號(*)導入一個包, 而不能使用 import java.* 或 import java.*.* 導入以 java為前綴的所有包;
2.3)出現的問題+解決方法:當類名發生命名沖突的時候,就要注意包名, 看個荔枝:
如,java.util 和 java.sql 都有日期類Date, 如果導入了兩個包:
import java.util.* ;import java.sql.*;2.3.1)解決方法: 此時編譯器無法確定程序使用的是哪一個Date 類;可以增加一個 import語句來解決這個問題:
import java.util.* ;import java.sql.*;import java.util.Date ;2.3.2)解決方法: 在每個類名的前面加上完整的包名:
java.util.Date today = new java.util.Date();java.sql.Date today = new java.sql.Date();在包中定位類是編譯器的工作, 類文件中的字節碼肯定使用完整的包名來引用其他類;
3.1) import語句不僅可以導入類,還增加了導入靜態方法和靜態域的功能;
3.2)看個荔枝(導入靜態域 和 靜態方法):
如,添加一條指令, import static java.lang.System.*; 就可以使用 System類的靜態方法和靜態域, 而不必加類名前綴:
out.PRintln("hello, world");exit(0);3.3)看個荔枝(導入特定的方法和域):
import static java.lang.Math.sqrt;import static java.lang.Math.pow;import static java.lang.System.out;public static void main(String[] args) { double aDouble; aDouble = sqrt(4); out.printf("%4f", pow(aDouble, 2)); }
我們還可以看到 sqrt(pow(x, 2) + pow(y, 2)) 看起來要比 Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) 清晰多了;
4.1)要想將類放入包中, 就必須將包的名字放在源文件的開頭, 包中定義類的代碼之前;
4.2)默認包:如果沒有在 源文件中放置 package 語句, 這個源文件的類就被放置在默認包中;
4.3)將包中的文件放到與完整包名匹配的子目錄中, 如, com.horstmann.corejava 包中的所有源文件應該被放置在 子目錄 com/hosrtman/corejava 中;編譯器將類文件也放在相同的目錄結構中;
4.4)需要注意: 編譯器對文件(帶有文件分隔符 和 擴展名.java 的文件)進行操作, 而java 解釋器加載類(帶有點(.)分隔符), 如(.號 和 /號 的區別)
javac com/mycompany/Pay.javajava com.mycompany.Pay.javaAlert)編譯器在編譯源文件的時候不檢查目錄結構(但該程序卻無法運行):
如, 假定有一個源文件開頭有下列語句: package com.mycompany;即使這個源文件沒有在子目錄 com/mycompany 下,也可以進行編譯;如果它不依賴于其他包, 就不會出現編譯錯誤。但是,最終的出程序將無法運行,因為虛擬機找不到類文件;
1)如果沒有指定 public 或 private, 那么這個部分(類、方法或變量)可以被同一個包中的所有方法訪問;
Attention)
新聞熱點
疑難解答