深圳市建設(shè)信息網(wǎng)官網(wǎng)寧波seo怎么推廣
在Java中,允許在一個(gè)類的內(nèi)部定義類,這樣的類稱作內(nèi)部類,內(nèi)部類所在的類稱作外部類。在實(shí)際開發(fā)中,根據(jù)內(nèi)部類的位置、修飾符和定義方式的不同,內(nèi)部類可分為4種,分別是成員內(nèi)部類、局部?jī)?nèi)部類、靜態(tài)內(nèi)部類、匿名內(nèi)部類。
成員內(nèi)部類(Member Inner Class):
- 定義在外部類的成員位置,與外部類的實(shí)例相關(guān)聯(lián),并且沒有使用 static 修飾的內(nèi)部類。
- 可以直接訪問(wèn)外部類的所有成員,包括私有成員,并且可以通過(guò)外部類對(duì)象創(chuàng)建實(shí)例。
- 使用語(yǔ)法:外部類名.內(nèi)部類名 變量名 = new 外部類名().new 內(nèi)部類名();
局部?jī)?nèi)部類(Local Inner Class):
- 定義在方法或代碼塊內(nèi)部,作用范圍僅限于所在的方法或代碼塊。
- 不能有訪問(wèn)修飾符,只能在定義它的方法或代碼塊中使用。
- 可以訪問(wèn)所在方法或代碼塊中的局部變量(必須是 final 或 effectively final)。
- 使用語(yǔ)法:class 內(nèi)部類名 { ... }
靜態(tài)內(nèi)部類(Static Inner Class):
- 定義在外部類中,它是使用 static 修飾的內(nèi)部類。
- 與外部類的實(shí)例無(wú)關(guān),通過(guò) 外部類名.內(nèi)部類名 直接訪問(wèn)。
- 只能直接訪問(wèn)外部類的靜態(tài)成員并創(chuàng)建實(shí)例,不能訪問(wèn)非靜態(tài)成員。
- 使用語(yǔ)法:外部類名.靜態(tài)內(nèi)部類名 變量名 = new 外部類名().靜態(tài)內(nèi)部類名();
匿名內(nèi)部類(Anonymous Inner Class):
- 沒有顯式的定義,直接通過(guò)實(shí)例化接口或抽象類來(lái)創(chuàng)建。
- 無(wú)需命名,通常用于臨時(shí)需要覆寫某個(gè)方法的情況,簡(jiǎn)化代碼編寫。
- 可以是接口的實(shí)現(xiàn)類或繼承自抽象類的子類。
- 使用語(yǔ)法:new 接口名/抽象類名() {?? //匿名內(nèi)部類實(shí)現(xiàn)部分}
以下的示例,演示了不同類型的內(nèi)部類的使用:
public class OuterClass {private int outerVariable = 10;private static int outerStaticVariable = 20;// 成員內(nèi)部類public class MemberInnerClass {public void display() {System.out.println("成員內(nèi)部類:" + outerVariable);}}// 靜態(tài)內(nèi)部類public static class StaticInnerClass {public void display() {System.out.println("靜態(tài)內(nèi)部類:" + outerStaticVariable);}}// 方法示例public void displayLocalInnerClass() {int localVariable = 30; // 局部變量// 局部?jī)?nèi)部類class LocalInnerClass {public void display() {System.out.println("局部?jī)?nèi)部類:" + localVariable);}}LocalInnerClass localInnerObj = new LocalInnerClass();localInnerObj.display();}// 匿名內(nèi)部類示例public void displayAnonymousInnerClass() {Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("匿名內(nèi)部類");}};Thread thread = new Thread(runnable);thread.start();}public static void main(String[] args) {OuterClass outerObj = new OuterClass();// 使用成員內(nèi)部類OuterClass.MemberInnerClass memberInnerObj = outerObj.new MemberInnerClass();memberInnerObj.display();//運(yùn)行:成員內(nèi)部類:10// 使用靜態(tài)內(nèi)部類OuterClass.StaticInnerClass staticInnerObj = new OuterClass.StaticInnerClass();staticInnerObj.display();//靜態(tài)內(nèi)部類:20// 調(diào)用局部?jī)?nèi)部類示例方法outerObj.displayLocalInnerClass();//局部?jī)?nèi)部類:30// 調(diào)用匿名內(nèi)部類示例方法outerObj.displayAnonymousInnerClass();//匿名內(nèi)部類}
}
這個(gè)示例中演示了四種不同類型的內(nèi)部類的使用方式:
-
成員內(nèi)部類(Member Inner Class):通過(guò)外部類實(shí)例創(chuàng)建內(nèi)部類實(shí)例,能夠訪問(wèn)外部類實(shí)例的成員變量。
-
靜態(tài)內(nèi)部類(Static Inner Class):直接通過(guò)外部類名訪問(wèn)內(nèi)部類,與外部類實(shí)例無(wú)關(guān),只能訪問(wèn)外部類的靜態(tài)成員。
-
局部?jī)?nèi)部類(Local Inner Class):定義在方法中的內(nèi)部類,僅在所在方法中可見,可以訪問(wèn)所在方法的局部變量,但被訪問(wèn)的局部變量必須是 final 或 effectively final 的。
-
匿名內(nèi)部類(Anonymous Inner Class):通過(guò)實(shí)例化接口或抽象類來(lái)創(chuàng)建,并且沒有顯式的定義,常用于覆寫一次性需要的方法。在示例中通過(guò)匿名內(nèi)部類實(shí)現(xiàn)了 Runnable 接口并創(chuàng)建線程。