1. 程式人生 > >關於內部類的剖析

關於內部類的剖析

靜態內部類 pub image inner 存在 col 關於 pre span

內部類根據使用不同的修飾符或者定位的位置不同,可以分為四種:

①  實例內部類:  內部類沒有使用static修飾

②  靜態內部類:  內部類使用了static修飾

③  局部內部類:  在方法中定義的內部類

④  匿名內部類:  適合於僅使用一次的類,屬於局部內部類的特殊情況

技術分享圖片

外部類的訪問修飾符:要麽用public,要麽缺省。

內部類看作是外部類的一個成員,好比字段,那麽內部類可以使用public/缺省/protected/private修飾

還可以是static修飾

------------------------------------------------------------------------------

實例內部類:

沒有使用static修飾內部類,說明內部類屬於外部類的對象,而不是屬於外部類。

特點:

1:創建實例內部類前,必須存在外部類對象,通過外部類對象創建內部類對象(當存在內部類對象時,一定存在外部類對象)

1 public class InstanceClass {
2     
3     //創建一個內部類對象
4     Outter.Inner inner = new Outter().new Inner();//方法一
5     //創建一個內部類對象
6     Outter outter = new Outter();
7     Outter.Inner inner2 = outter.new
Inner();//方法二
8 }

2:實例內部類可以直接訪問外部類成員

class Outter{
  String name = "amos";     
   class Inner{
      public void getOutterName(){
             System.out.println(name);
        }
  }
}    

3.外部類必須通過內部類的實例去訪問內部類的成員

class Outter{
    public void getAge() {
        System.out.println(
new Outter().new Inner().age); } class Inner{ String name = "wong"; }
}

4.如果實例內部類和外部類存在同名的字段或方法abc,那麽在內部類中

    this.abc表示訪問內部類成員

    外部類.this.abc:表示訪問外部類成員

class Outter{
    String name = "Outter";    
    class Inner{
        String name = "Inner";
        public void getName() {
            String name = "local";
            System.out.println(name);//local
            System.out.println(this.name);//Inner
            System.out.println(Inner.this.name);//Outter
        }
    }
}

-----------------------------------------------------------------------------------------------------------------------------------------------------------

靜態內部類:

使用static修飾的內部類

特點:

1.在創建靜態內部類的實例時,不必創建外部類的實例

Outter.Inner  inner = new Outter.Inner();

2.靜態內部類可以直接訪問外部類的靜態成員

package innerSubclassTest;
class Outter{
    static String name = "Outter";
    static class Inner{
        public void getOutterName() {
            System.out.println(name);//直接訪問外部類靜態變量name
        }
    }
}

必須通過外部類的實例去訪問外部類的實例成員

class Outter{
    int age = 18;
    static class Inner{
        public void getAge() {
            System.out.println(new Outter().age);
        }
    }
}

3.在靜態內部類中可以定義靜態成員和實例成員

4.測試類可以通過完整的類名直接訪問靜態內部類的靜態成員

關於內部類的剖析