Java™ 教程(使用包成員)

使用包成員

組成包的類型稱爲包成員。java

要從其包外部使用公共包成員,你必須執行如下操做之一:segmentfault

  • 經過其徹底限定名稱引用該成員
  • 導入包成員
  • 導入成員的整個包

每種狀況都適用於不一樣的狀況,如如下各節所述。ide

經過其徹底限定名稱引用包成員

到目前爲止,本教程中的大多數示例都經過簡單名稱引用類型,例如RectangleStackOfInts,若是你編寫的代碼與該成員位於同一個包中,或者已導入該成員,則可使用包成員的簡單名稱。工具

可是,若是你嘗試使用其餘包中的成員而且還沒有導入該包,則必須使用該成員的徹底限定名稱,該名稱包括包名稱,這是上一個示例中graphics包中聲明的Rectangle類的徹底限定名稱。code

graphics.Rectangle

你可使用此限定名稱來建立graphics.Rectangle的實例:對象

graphics.Rectangle myRect = new graphics.Rectangle();

限定名稱不常常使用,重複使用名稱時,重複鍵入名稱會變得乏味,代碼變得難以閱讀,或者,你能夠導入成員或其包,而後使用其簡單名稱。教程

導入包成員

要將特定成員導入當前文件,請在任何類型定義以前在文件開頭放置import語句,但在package語句以後(若是有),如下是從上一節中建立的graphics包導入Rectangle類的方法。接口

import graphics.Rectangle;

如今你能夠經過簡單名稱引用Rectangle類。get

若是你只使用graphics包中的一些成員,這種方法頗有效,可是若是從包中使用多種類型,則應導入整個包。編譯器

導入整個包

要導入特定包中包含的全部類型,請使用帶有星號(*)通配符的import語句。

import graphics.*;

如今,你能夠經過簡單名稱引用graphics包中的任何類或接口。

Circle myCircle = new Circle();
Rectangle myRectangle = new Rectangle();

import語句中的星號只能用於指定包中的全部類,如此處所示,它不能用於匹配包中類的子集,例如,如下內容與graphics包中以A開頭的全部類都不匹配。

// does not work
import graphics.A*;

相反,它會生成編譯器錯誤,使用import語句,一般只導入單個包成員或整個包。

另外一種不太常見的導入形式容許你導入封閉類的公共嵌套類,例如,若是graphics.Rectangle類包含有用的嵌套類(如Rectangle.DoubleWideRectangle.Square),則可使用如下兩個語句導入Rectangle及其嵌套類。

import graphics.Rectangle;
import graphics.Rectangle.*;

請注意,第二個import語句不會導入Rectangle

另外一種不常見的導入形式是靜態導入語句,將在本節末尾討論。

爲方便起見,Java編譯器會自動爲每一個源文件導入兩個完整的包:java.lang包和當前包(當前文件的包)。

包的表觀層次結構

首先,包彷佛是分層的,但它們不是,例如,Java API包括java.awt包,java.awt.color包,java.awt.font包以及許多以java.awt開頭的包。可是,java.awt包中包含java.awt.color包、java.awt.font包和其餘java.awt.xxxx包。前綴java.awt(Java抽象窗口工具包)用於許多相關的包,以使關係明顯,但不顯示包含。

導入java.awt.*將導入java.awt包中的全部類型,但它不導入java.awt.colorjava.awt.font或任何其餘java.awt.xxxx包。若是你計劃使用java.awt.color中的類和其餘類型以及java.awt中的類,則必須導入這兩個包使用其全部文件:

import java.awt.*;
import java.awt.color.*;

名稱歧義

若是一個包中的成員與另外一個包中的成員共享其名稱而且兩個包都已導入,則必須經過其限定名稱引用每一個成員,例如,graphics包定義了一個名爲Rectangle的類,java.awt包還包含一個Rectangle類,若是已導入graphicsjava.awt,則如下內容不明確。

Rectangle rect;

在這種狀況下,你必須使用成員的徹底限定名稱來準確指出你想要的Rectangle類,例如:

graphics.Rectangle rect;

靜態導入語句

在某些狀況下,你須要頻繁訪問static final字段(常量)和來自一個或兩個類的靜態方法,反覆對這些類的名稱進行前綴可能會致使代碼混亂,static import語句爲你提供了一種導入要使用的常量和靜態方法的方法,這樣你就不須要爲其類的名稱添加前綴。

java.lang.Math類定義PI常量和許多靜態方法,包括計算正弦、餘弦、切線、平方根、最大值
最小值、指數等的方法,例如:

public static final double PI 
    = 3.141592653589793;
public static double cos(double a)
{
    ...
}

一般,要從其餘類使用這些對象,前綴類名,以下所示。

double r = Math.cos(Math.PI * theta);

你可使用static import語句導入java.lang.Math的靜態成員,這樣你就不須要爲類名稱添加前綴MathMath的靜態成員能夠單獨導入:

import static java.lang.Math.PI;

或做爲一個組:

import static java.lang.Math.*;

導入後,能夠無限制地使用靜態成員,例如,以前的代碼段將變爲:

double r = cos(PI * theta);

顯然,你能夠編寫本身的類,其中包含你常常使用的常量和靜態方法,而後使用static import語句,例如:

import static mypackage.MyConstants.*;
很是謹慎地使用 static import,過分使用靜態導入會致使代碼難以閱讀和維護,由於代碼的讀者不知道哪一個類定義了特定的靜態對象,正確地使用, static import經過刪除類名重複使代碼更具可讀性。

上一篇:建立和使用包

下一篇:管理源文件和類文件

相關文章
相關標籤/搜索