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