1、概念
存在於Java類的內部的Java類。
2、分類
- 成員內部類
格式class OuterClass { class InnerClass {} //成員內部類 }
- 方法內部類
格式class OuterClass { public void doSomething(){ class Inner{ } } }
只能在定義該內部類的方法內實例化
方法內部類對象不能使用該內部類所在方法的非final局部變量
當一個方法結束,其棧結構被刪除,局部變量成為歷史。但該方法結束后,在方法內創建的內部類對象可能仍然存在於堆中
- 匿名內部類
a) 繼承式匿名內部類格式public class Fish { /** * 游泳方法 */ public void swim() { System.out.println("我在游泳!"); } public static void main(String[] args) { //創建魚對象 Fish fish = new Fish() { //重寫swim方法 public void swim() { System.out.println("我在游泳,突然發生海嘯,我撤了!"); } }; fish.swim(); } }
b) 接口式匿名內部類格式interface IFish { public void swim(); } class TestIFish { public static void main(String[] args) { IFish fish = new IFish() { @Override public void swim() { System.out.println("我是一條小丑魚,我在游泳"); } }; fish.swim(); } }
接口式的匿名內部類是實現了一個接口的匿名類,感覺上實例化了一個接口。
c) 參數式的匿名內部類
格式public class TestCrucian { public static void main(String[] args) { Crucian c = new Crucian(); c.swim(new IFish() { @Override public void swim() { System.out.println("鯽魚在河水里游泳!"); } }); } } /** * 鯽魚游泳 * @author handsomX * 2018年8月13日上午9:41:01 */ class Crucian { /** * 鯽魚的游泳方法 * @param fish */ void swim(IFish fish) { fish.swim(); } }
- 靜態嵌套類
靜態嵌套類,並沒有對實例的共享關系,僅僅是代碼塊在外部類內部
靜態的含義是該內部類可以像其他靜態成員一樣,沒有外部類對象時,也能夠訪問它
靜態嵌套類僅能訪問外部類的靜態成員和方法
在靜態方法中定義的內部類也是靜態嵌套類,這時候不能在類前面加static關鍵字
格式class OuterFish { /** * 靜態嵌套類 * @author handsomX * 2018年8月13日上午10:57:52 */ static class InnerFish { } } class TestStaticFish { public static void main(String[] args) { //創建靜態內部類對象 OuterFish.InnerFish iFish = new OuterFish.InnerFish(); } }
3、內部類的作用
- 內部類提供了某種進入其繼承的類或實現的接口的窗口
- 與外部類無關,獨立繼承其他類或實現接口
- 內部類提供了Java的"多重繼承"的解決方案,彌補了Java類是單繼承的不足
4、特點
- 內部類仍然是一個獨立的類,在編譯之后內部類會被編譯成獨立的.class文件,但是前面冠以外部類的類名和$符號
- 內部類不能用普通的方式訪問。內部類是外部類的一個成員,因此內部類可以自由地訪問外部類的成員變量,無論是否是private的
- 內部類聲明成靜態的,就不能隨便的訪問外部類的成員變量了,此時內部類只能訪問外部類的靜態成員變量
參考: