前言:對于 JAVA 基礎的內容,其實網上資料挺多的临庇,本打算只寫 Android 相關技術文章反璃,但對于內部類這個基礎點昵慌,在春招的準備過程中,發(fā)現(xiàn)里面有些門道而且很少人深入研究淮蜈,特此貢獻給大家
深入理解 JAVA 內部類系列文章如下:
本文主要討論是內部類的使用和分類
閱讀本文大概需要 7 分鐘斋攀,大家耐心點看下去,會有不一樣的收獲哈~
為什么使用內部類?(訪問內部數(shù)據(jù)梧田,更好封裝淳蔼,使用組合替代多重繼承,回調調用)
- 一個內部類的對象能夠訪問創(chuàng)建它的對象的實現(xiàn)裁眯,包括私有數(shù)據(jù)鹉梨。
- 對于同一個包中的其他類來說,內部類能夠隱藏起來穿稳,提供了更好的封裝存皂。
- 它能夠通過組合非常好的解決多重繼承的問題, 因為它就是一個獨立的實體
- 匿名內部類可以很方便的定義回調。
共同特點:
- 外部類是不能直接使用非靜態(tài)內部類的成員和方法的逢艘,可先創(chuàng)建非靜態(tài)內部類的對象旦袋,然后通過非靜態(tài)內部類的對象來訪問其成員變量和方法;
- 內部類中定義的方法可以直接訪問外部類中的數(shù)據(jù),而不受訪問控制符的影響它改,如直接訪問外部類中的私有屬性
- 如果外部類和內部類具有相同的成員變量或方法疤孕,內部類默認訪問自己的成員變量或方法,如果要訪問外部類的成員變量搔课,可以使用 this 關鍵字胰柑,如:Outer.this.name
- 編譯后,會發(fā)現(xiàn)產生了兩個 .class 文件:
Outer.class
和Outer$Inner.class
-
除了靜態(tài)內部類爬泥,其他內部類中不能存在任何 static 的變量和方法柬讨,但都可以定義常量:
- 因為非靜態(tài)內部類是要依賴于外部類的實例,而靜態(tài)變量和方法是不依賴于對象袍啡,僅與類相關踩官,所以會矛盾了。簡而言之: 非靜態(tài)內部類的作用域是實例級別的境输,此時在非靜態(tài)內部類中定義靜態(tài)域或方法蔗牡,作用域是類級別的,所以互相矛盾嗅剖,其實這種情況編譯是不能通過的
- 常量是在編譯器就確定的辩越,放到所謂的常量池了
內部類分類
(一).成員內部類:
語法:內部類 對象名 = 外部類對象引用.new 內部類();
- 成員內部類定義在外部類的內部,相當于外部類的一個成員變量的位置信粮,成員內部類可以使用任意訪問控制符黔攒,如 public、protected、private 等
- 定義了成員內部類后督惰,必須使用外部類對象來創(chuàng)建內部類對象不傅,而不能直接去 new 一個內部類對象,即:
內部類 對象名 = 外部類對象引用.new 內部類();
(二).靜態(tài)內部類: 是 static 修飾的內部類
語法:內部類 對象名 = new 內部類();
- 靜態(tài)內部類不能直接訪問外部類的非靜態(tài)成員赏胚,但可以通過
new 外部類().成員
的方式訪問 - 如果外部類的靜態(tài)成員與內部類的成員名稱相同访娶,可通過
類名.靜態(tài)成員
訪問外部類的靜態(tài)成員;如果外部類的靜態(tài)成員與內部類的成員名稱不相同觉阅,則可通過成員名
直接調用外部類的靜態(tài)成員 - 創(chuàng)建靜態(tài)內部類的對象時崖疤,不需要外部類的對象,可以直接創(chuàng)建
內部類 對象名 = new 內部類();
(三).方法局部內部類: 訪問僅限于方法作用域內
語法:內部類 對象名 = new 內部類();
- 必須在同一個方法作用域內完成定義類和創(chuàng)建對象
- 局部內部類就像是方法里面的一個局部變量一樣留拾,是不能有 public戳晌、protected、private 以及 static 權限修飾符
(四).匿名內部類: 直接使用 new 來生成一個對象的引用
語法:略//是通過繼承一個類或者實現(xiàn)一個接口創(chuàng)建對象痴柔,必須實現(xiàn)所有抽象方法
- 匿名內部類肯定是局部內部類 (因為是在一個方法里面完成的),因為在 java 中疫向,語句必須寫在方法里咳蔚,而匿名內部類其實就是一條特殊的語句
- 對于匿名內部類的使用它是存在一個缺陷的,就是它僅能被使用一次搔驼,創(chuàng)建匿名內部類時它會立即創(chuàng)建一個該類的實例谈火,該類的定義會立即消失,所以匿名內部類是不能夠被重復使用;
- 使用匿名內部類時舌涨,我們必須是繼承一個類或者實現(xiàn)一個接口糯耍,但是兩者不可兼得,只能繼承一個類或者實現(xiàn)一個接口
- 匿名內部類中不能存在任何的靜態(tài)成員變量和靜態(tài)方法囊嘉,匿名內部類不能是抽象的温技,它必須要實現(xiàn)繼承的類或者實現(xiàn)的接口的所有抽象方法
- 匿名內部類中是不能定義構造函數(shù)的,匿名內部類中不能存在任何的靜態(tài)成員變量和靜態(tài)方法
- 匿名內部類初始化:可使用構造代碼塊!!! 利用構造代碼塊能夠達到為匿名內部類創(chuàng)建一個構造器的效果
閱讀到最后不知道大家花了多少時間扭粱,但這個文章的數(shù)字大概需要閱讀 3.5 分鐘哈舵鳞,但理解可能會花費就會比較耗時了,但希望大概能對內部類有個深刻的理解
點擊 深入理解 JAVA 內部類 內部類的 final 問題琢蛤,即可進入下一個內容蜓堕,了解為什么內部類使用到的一些變量會經常使用到 final 修飾符