嵌套類(Nested Classes)
概述
Java允許在一個(gè)類的內(nèi)部定義一個(gè)類侄刽,這樣的類稱為嵌套類。例:
class OuterClass {
...
class NestedClass {
...
}
}
<span style="background:yellow">嵌套類分為兩類:靜態(tài)和非靜態(tài)朋凉。 用static 修飾的嵌套類稱為靜態(tài)嵌套類州丹,未使用static修飾的嵌套類稱為內(nèi)部類。 </span>
class OuterClass {
...
static class StaticNestedClass {
...
}
class InnerClass {
...
}
}
嵌套類是其所在類的成員杂彭。非靜態(tài)嵌套類(內(nèi)部類)可以訪問(wèn)所在類的其他成員(包括用private修飾的)墓毒。 靜態(tài)嵌套類不能訪問(wèn)所在類的其他成員。嵌套類可以擁有private, public, protected, or package private等訪問(wèn)權(quán)限盖灸。 (外部類只能有public 或 package private兩種訪問(wèn)權(quán)限)
使用內(nèi)部類的原因
將僅在一處使用的類整合到使用該類的類中:若一個(gè)類僅對(duì)某個(gè)類有用蚁鳖,則直接將其嵌入該類中,讓兩個(gè)類耦合不失為一種合理的選擇赁炎。使用這種嵌入式的“幫助類”可以使代碼包的結(jié)構(gòu)更簡(jiǎn)介醉箕。
增強(qiáng)封裝:假設(shè)有兩個(gè)外部類钾腺,A和B。B需要訪問(wèn)A類的私有成員讥裤。只有將B類封裝進(jìn)A類時(shí)放棒,B類才能訪問(wèn)A類中聲明的私有成員。與此同時(shí)己英,B類也與其所在類以外的類隔絕開(kāi)來(lái)间螟。
增強(qiáng)代碼的可讀性和可維護(hù)性: 當(dāng)某個(gè)類只有在一個(gè)類中才會(huì)用到時(shí),可以將其封裝進(jìn)該頂層類中损肛。
靜態(tài)嵌套類
靜態(tài)嵌套類與其外部類類本身相關(guān)聯(lián)厢破。和靜態(tài)方法一樣,靜態(tài)嵌套類不能直接引用其所在類的實(shí)例變量和實(shí)例方法治拿。
<span style="background:yellow">Note: A static nested class interacts with the instance members of its outer class (and other classes) just like any other top-level class. In effect, a static nested class is behaviorally a top-level class that has been nested in another top-level class for packaging convenience. </span>
使用內(nèi)部類的外部類類名訪問(wèn)靜態(tài)嵌套類:
OuterClass.StaticNestedClass
創(chuàng)建靜態(tài)嵌套類:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
內(nèi)部類
內(nèi)部類與其外部類的實(shí)例相關(guān)聯(lián)摩泪,可直接引用該實(shí)例的實(shí)例變量和實(shí)例方法。內(nèi)部類本身不能定義靜態(tài)成員劫谅。內(nèi)部類的實(shí)例只能存在于其外部類的實(shí)例中见坑。
創(chuàng)建內(nèi)部類的實(shí)例時(shí)必須先創(chuàng)建其外部類的實(shí)例。之后可按下面的格式創(chuàng)建:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
存在兩種特殊的內(nèi)部類:
遮蔽(Shadowing)
若在某個(gè)具體作用域(例如內(nèi)部類或方法簽名)中定義的變量的變量名(例如成員變量或參數(shù)名)與外部類的作用域中定義的相同捏检,則較小作用域中定義的變量會(huì)遮蔽較大作用域中定義的變量荞驴。因此不能僅憑變量名本身引用該變量。
例:
public class ShadowTest {
public int x = 0;
class FirstLevel {
public int x = 1;
void methodInFirstLevel(int x) {
System.out.println("x = " + x);
System.out.println("this.x = " + this.x);
System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);
}
}
public static void main(String... args) {
ShadowTest st = new ShadowTest();
ShadowTest.FirstLevel fl = st.new FirstLevel();
fl.methodInFirstLevel(23);
}
}
輸出如下:
x = 23
this.x = 1
ShadowTest.this.x = 0
總結(jié)
- 優(yōu)先級(jí) --> 方法簽名中的變量> 內(nèi)部類的成員變量 > 外部類的成員變量
- 訪問(wèn)方式 --> varibaleName this.variableName OuterClass.this.variableName
歡迎到作者github主頁(yè)交流