天天看點

《Android程式設計》一2.3 作用域

作用域決定了程式中的變量、方法和其他符号的可見範圍。任何符号在其作用域外都是完全不可見的,不能被使用。在這一節我們将簡要地介紹作用域的主要内容,從最高層開始。

java包提供了一種機制,它把相關類型分組到一個全局唯一的命名空間。這種分組機制可以防止在一個包的命名空間内的辨別符和其他開發人員在其他命名空間内建立和使用的辨別符沖突。

一個典型的java程式由很多java包的代碼組成。典型的java運作時環境提供了如java.lang和java.util這樣的包。此外,程式可能會依賴于其他通用的庫,類似于org.apache樹。傳統上,應用代碼(你所建立的代碼)在你所建立的包内,包名是通過反轉域名并附加程式名字生成的。是以,如果你的域名是androidhero.com,你的包所屬的樹的根是com.androidhero,則可以把代碼放到如com.androidhero.awesomeprogram和com.androidhero.geohottness.service這樣的包中。用于android應用的典型的包在布局上會包含一個持久性包、ui包和負責應用邏輯和控制器代碼的包。

包除了定義了全局唯一的命名空間外,包内對象的成員(成員變量和方法)之間的可見性也不同。類的内部變量對于在同一個包内的類是可見的,而對于其他包内的類則是不可見的。這個話題在後面還會進一步探讨。

聲明一個類屬于某個包的方法是,在定義類的檔案的最上方,使用package這個關鍵字按照下面這個方式聲明:

package your.qualifieddomainname.functionalgrouping

不要過分簡化包名!因為一個快速、臨時的實作方式可能需要使用很多年,如果不能保證包名唯一,那麼以後一定會深受其困擾。

一些大型的項目通過使用完全不同的頂級域名來實作公有api包和這些api的實作之間的隔離。舉個例子,android api使用頂級包名android,這些api的實作則在com.android包内。sun的java源代碼采用的機制也類似于此。公有api在java包内,但是這些api的實作則放在了sun包内。在任意一種情況下,如果一個應用導入的是某個實作包,則這個應用會反複無常,因為它依賴于一些非公有的api。

雖然把代碼添加到已有的包内是可以的,但通常認為這是一種不好的做法。通常情況下,除了名字空間,包通常是一棵源代碼樹,其至少和逆轉的域名一樣高。雖然這隻是傳統習慣,但是java開發人員通常會期望com.brashandroid.coolapp.ui這個包中包含了coolapp ui的所有源代碼。如果另一棵樹的某些地方也有coolapp ui的一些代碼,很多人會覺得很不習慣。

注意: android應用架構中也有包的概念。但它不同于這裡所說的包,在第3章會對android應用架構的這種包進行專門說明。不要把它和java的包相混淆。

前文提過,類的成員有特殊的可見性規則。大多數java塊中的定義是有作用域的:它們隻在代碼塊本身及内嵌于其中的代碼塊中可見。然而,類中的定義在代碼塊外也可能是可見的。java支援類将其頂級成員(其方法和成員變量)通過通路修飾符(access modifiers)釋出給其他類的代碼。通路修飾符關鍵字修改了聲明的可見性。

在java中有3個通路修飾符關鍵字:public、protected和private。共支援4種通路級别。通路修飾符影響的是類成員在類外面的通路性,但類内部的代碼塊遵循的是普通的作用域,不需要考慮通路修飾符的影響。

private修飾符的限制最高。帶private關鍵字的聲明在代碼塊外是不可見的。這種聲明是最安全的,它會確定僅在類的内部會有指向這個聲明的引用。private聲明越多,類就越安全。

限制程度僅次于private修飾符的是預設的通路限制,即package通路。沒有任何修飾符的聲明屬于預設情況,預設的通路可見性是指隻能在同一個包中的其他類中可見。預設通路是建立對象共享的一種非常便捷的方式,java的預設聲明和c++中的friend聲明

類似。

protected通路修飾符除了支援所有的預設通路權限之外,還允許通路子類。任何包含protected聲明的類都能夠通路這些聲明。

public通路修飾符是限制條件最弱的修飾符,其允許從任何地方對它進行通路。

下面的這個例子對這些修飾符的使用方式進行了具體的示範。有4個類,分别屬于兩個不同的包over.here和over.there,這4個類都引用了其中類accessible中聲明的成員變量:

《Android程式設計》一2.3 作用域
《Android程式設計》一2.3 作用域
《Android程式設計》一2.3 作用域
《Android程式設計》一2.3 作用域

繼續閱讀