什么是JAVA內部類?


1、概念
存在於Java類的內部的Java類。

2、分類

  • 成員內部類
    格式
    class OuterClass {
        class InnerClass {} //成員內部類
    }

     

    編譯之后會生成兩個class文件:OuterClass.class和OuterClass$InnerClass.clas
     
  • 方法內部類
    格式
    class OuterClass {
        public void doSomething(){
            class Inner{
            }
        }
    }

     

    編譯之后會生成兩個class文件:OuterClass.class和OuterClass$1InnerClass.class
    只能在定義該內部類的方法內實例化
    方法內部類對象不能使用該內部類所在方法的非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();
        }
    }

     

    編譯后生成兩個class文件:Fish.class和Fish$1.class


    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();
        }
    }

     

    編譯后生成3個class文件:IFish.class、TestIFish.class和TestIFish$1.class
    接口式的匿名內部類是實現了一個接口的匿名類,感覺上實例化了一個接口。


    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();
        }
    }

     

    編譯后生成3個class文件:Crucian.class、TestCrucian.class和TestCrucian$1.class

 

  • 靜態嵌套類
    靜態嵌套類,並沒有對實例的共享關系,僅僅是代碼塊在外部類內部
    靜態的含義是該內部類可以像其他靜態成員一樣,沒有外部類對象時,也能夠訪問它
    靜態嵌套類僅能訪問外部類的靜態成員和方法
    在靜態方法中定義的內部類也是靜態嵌套類,這時候不能在類前面加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的
  • 內部類聲明成靜態的,就不能隨便的訪問外部類的成員變量了,此時內部類只能訪問外部類的靜態成員變量

 

參考:


  

  

來一道刷了進BAT的面試題?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM