天天看點

内部類 和匿名内部類的基本應用

自己的筆記:

     内部的通路規則:

          内部類可以直接通路外部類的成員,包括私有。

          外部類要想通路内部類,必須建立對象。

          之是以可以直接通路外部類的成員,因為内部類持有外部類的引用,格式:Outer.this.x

     通路格式:

          在内部類定義在外部類中的成員位置上,而且是非私有,可以在外部的其他類中。

          可以直接建立内部類的對象。

          格式:1. 外部類.内部類 變量名 = 外部對象.内部對象;

                  Outer.Inner in = new Outer().new Inner();

               2. 當内部類在成員位置上,就可以被成員修飾符修飾。

                    比如 private:将内部類在外部類中進行封裝。

                         static: 内部類具有了static特性。 

                                 當内部類被static修飾時,隻能直接通路外部類的static成員,

                                 出現了想問局限。

               3.在外部類中,如何直接通路static内部類中非靜态成員?

                       new Outer.Inner().function();

               4. 在外部類中,如何直接通路static内部類中的靜态成員?

                        Outer.Inner.function();

     注意:

          當在内部類中定義了靜态成員,那麼内部類必須是靜态内部類。(内部類中不能有靜态聲明除非内部類也是靜态的)。

          當外部類中的靜态方法通路内部類中的方法時,那麼内部類必須為靜态的。

     什麼時候使用内部類:

          當描述的事物時,事物内部還有事物,該事物就應該用内部類封裝:人-人體(private)                                                                                                                                                                     

          内部類中定義在局部時,

              1. 不可被成員修飾符修飾。

              2. 可以直接通路外部類中的成員,因為他還持有外部類的引用,

                 但是是不可以通路他所在的局部變量,隻能通路被final修飾過的局部變量 。

      匿名内部類:

          1. 匿名内部類其實就是内部類的簡寫格式。      

          2. 定義匿名内部類的前提:

                内部類必修是繼承一個類或者是接口

          3. 匿名内部類的格式:

                new 父類或者接口(){定義子類的内容}

          4. 其實匿名内部類就是一個匿名子類對象,而且這個對象有點胖,也可以說是帶内容的對象。

          5. 在匿名内部類中可以寫其他成員,但每次隻能調用一個方法,

             但可以幫他取個名字用父類的引用指向子類的對象。

       使用情況: 當使用的方法的參數類型是一個接口類型時,直接向調用方法傳入一個匿名對象。

    面試題:假如我沒有父類,也沒有接口讓我去實作,還能寫匿名内部類嗎?

           答案 :能

     public class{

        new Object(){

            public void function(){}

          }

     }