摘要:方法內部類就是局部內部類,一般定義在類的局部位置,它可以訪問當前代碼塊及外部類的所有變量。
今天溫習一下 Java 中的內部類,內部類一般有如下幾種:靜態內部類、成員內部類、匿名內部類和方法內部類,下文中將主要介紹靜態內部類和成員內部類,主要內容如下:
概述
靜態內部類
成員內部類
匿名內部類和方法內部類
總結
概述顧名思義內部類就是在一個類內部定義的類,它是內部類是一個獨立的類,編譯之后會生成獨立的 .class 文件,其名稱前面會有外部類的類名稱以及 $ 符號,內部類同樣可以使用 private 、default、protected、public 修飾,下面是內部類的寫法,具體參考如下:
/** * 內部類 * @author jzman */ public class OutterClass { //靜態內部類 private static class StaticInnerClass{ } //成員內部類 private class FieldInnerClass{ } //匿名內部類 Runnable runnable = new Runnable() { @Override public void run() { } }; private void method() { //方法內部類(局部內部類) class InnerClass{ } } }靜態內部類
靜態內部類可以有靜態成員和非靜態成員;
靜態內部類可以直接調用外部類的靜態成員和靜態方法,但不能調用外部類的非靜態成員和非靜態方法;
在不相關類中,可以直接創建靜態內部類的對象;
靜態內部類與其外部類聯系很少,其創建基本不依賴與外部類。
/** * 靜態內部類 * @author jzman */ public class StaticInnerClassDemo { public static void main(String[] args) { //其他類可以直接創建某個非私有內部類的實例 OutterClass1.InnerClass innerClassB = new OutterClass1.InnerClass(); InnerClass innerClassA = new InnerClass(); innerClassA.testStaticInnerClass(); //... } } //外部類 class OutterClass1{ //非靜態成員變量 int ageA = 18; //非靜態方法 public void methodA() { } //靜態成員變量 static int ageB = 18; //靜態方法 public static void methodB() { } private void methodC() { //外部類調用靜態內部類的方法 InnerClass innerClass = new InnerClass(); innerClass.testStaticInnerClass(); } //靜態內部類 static class InnerClass{ public void testStaticInnerClass(){ //靜態內部類不能訪問其外部類的非靜態成員變量和方法 // System.out.println(ageA); // methodA(); //靜態內部類可以訪問其外部類的靜態成員和方法 System.out.println(ageB); methodB(); } } }成員內部類
成員內部類可以訪問所有外部類的成員;
成員內部類對象的創建必須依賴于外部類對象,先有外部類才會有內部類;
成員內部類就是外部類的一個成員變量;
成員內部類不能有靜態成員,但允許常量存在。
/** * 成員內部類 * @author jzman */ public class FieldInnerClassDemo { public static void main(String[] args) { //成員內部類依賴與其外部類,不能越過外部類直接創建內部類的實例 // InnerClass innerClass = new InnerClass(); //正確在其他類創建創建內部類的實例 OutterClass2 outterClass2 = new OutterClass2(); OutterClass2.InnerClass innerClass = outterClass2.new InnerClass(); innerClass.testFieldInnerClassMethod(); } } //外部類 class OutterClass2{ //非靜態成員變量 int ageA = 18; //非靜態方法 public void methodA() { } //靜態成員變量 static int ageB = 18; //靜態方法 public static void methodB() { } private void methodC() { //外部類調用成員內部類的方法 InnerClass innerClass = new InnerClass(); innerClass.testFieldInnerClassMethod(); } //成員內部類 class InnerClass{ //成員內部類不能有靜態成員 // static int a = 10; //成員內部類允許常量形式存在 static final int b = 10; public void testFieldInnerClassMethod(){ //成員內部類可以直接訪問其外部類的所有成員變量及方法(靜態和非靜態) System.out.println(ageA); methodA(); System.out.println(ageB); methodB(); } } }匿名內部類和方法內部類
匿名內部類當然是沒有確定的名稱,其實現都是在類體中具體實現,最終返回相關類的一個匿名對象,由于最終返回的是一個匿名的實例,所以必須在匿名內部類之后添加分號。方法內部類就是局部內部類,一般定義在類的局部位置,它可以訪問當前代碼塊及外部類的所有變量。
總結類之間的成員變量的互相調用實際上還是訪問對象的成員變量,如成員內部類能夠訪問外部類的成員變量或方法是因為內部類持有外部類的引用,一般通過 OutterClass.this 獲取外部類的對象,如果外部類想要訪問內部類的成員變量或方法當然也需要持有內部類的引用,所以外部類訪問內部類的成員變量或方法時,必須先創建內部類的對象,然后通過對象來方位相應的成員變量或方法。
可以選擇關注微信公眾號:jzman-blog 獲取最新更新,一起交流學習!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74944.html
內部類 內部類主要作用 內部類提供了更好的封裝,可以吧內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類。 內部類成員可以直接訪問外部類的私有數據,因為內部類被當成其外部類成員,同一個類的成員之間可以互相訪問,但外部類不能訪問內部類的實現細節。 匿名內部類適合用于創建那些僅需要使用一次的類。 定義內部類與外部類的語法大致相同,內部類除需要定義在其他類里面之外,還有兩點區別: 內...
摘要:即使抽象類里不包含抽象方法,這個抽象類也不能創建實例抽象類可以包含成員變量方法普通方法和抽象方法構造器初始化塊內部類接口枚舉種成分。 抽象類 當編寫一個類時,常常會為該類定義一些方法,這些方法用以描述該類的行為方式,那么這些方法都有具體的方法體。但在某些情況下,某個父類只是知道其子類應該包含怎樣的方法,但無法準確地知道這些子類如何實現這些方法。使用抽象方法即可滿足該要求:抽象方法是只有...
摘要:內部類的使用場景上面介紹了中種內部類的定義,接著我們介紹這些內部類的一些使用場景。成員內部類的使用場景普通內部類可以訪問外部類的所有成員和方法,因此當類需要使用類,同時需要訪問的成員方法時,可以將作為的成員內部類。 文章出自:安卓進階學習指南 主要貢獻者: Cloud9527 Alex_趙 Struggle shixinzhang 讀完本文你將了解: [TOC] 通過反編譯...
閱讀 1128·2021-08-12 13:24
閱讀 2974·2019-08-30 14:16
閱讀 3303·2019-08-30 13:01
閱讀 2064·2019-08-30 11:03
閱讀 2769·2019-08-28 17:53
閱讀 3079·2019-08-26 13:50
閱讀 2263·2019-08-26 12:00
閱讀 943·2019-08-26 10:38