Java基礎8:java內部類的作用及其四種定義形式

類的編碼規則:

1. 一個.java文件中可以有很多類

2. public權限的類最多只能有一個 ,.java文件的文件名必須是public類的全名

3. 如果沒有public類, 那麼文件名可以隨便命名

4. 將一個類定義在另一個類裏面, 這樣的類就稱爲內部類

5. javac編譯.java文件的時候 , 會爲每個類生成一個.class文件

6. 內部類的文件名形式爲Outer$Inner1.class

1. 成員內部類: 下面的代碼定義了一個成員內部類

 

public class Outer {

   privateInteger num= 0;

 

   private class Inner1 {

       privateInteger num= 1;

 

       public void print() {

            System.out.println("inner1 print outer's num = "+ Outer.this.num);

       }

   }

 

   protected classInner2 {

       privateInteger num= 2;

 

       public void print() {

            System.out.println("inner2 print outer's num = "+ Outer.this.num);

       }

   }

 

   public voidprint() {

       System.out.println("outer print inner1's num1 = "+ new Inner1().num);

       System.out.println("outer print inner2's num2 = "+ new Inner2().num);

   }

 

   public staticvoidmain(String[] args) {

       Outer outer = new Outer();

       outer.newInner1().print();

        outer.print();

       outer.newInner2().print();

   }

}

 

代碼分析:

 

- 內部類可以用protectedprivate關鍵字來進行修飾

- 在內部類的print()方法中, 我們可以看到成員內部類可以任意訪問外部類的私有變量和方法

- 成員內部類擁有和外部類擁有同名的變量num和方法print(), 我們在內部類中通過Outer.this.num來調用外部類的同名變量和同名方法

- 外部類調用成員內部類的變量num和方法print()的時候需要先實例化一個內部類的對象newInner1()才能調用

- 成員內部類的實例化操作,要先實例化外部類Outerouter = new Outer();, 然後通過outer對象實例化一個內部類outer.newInner1()

2.靜態內部類:

public class Outer {

   private staticInteger count= 0;

 

   public void print() {

       System.out.println("outer print inner3 count = "+ new Inner3().count);

   }

 

   public staticclassInner3 {

       privateInteger count= 3;

 

       public void print() {

            System.out.println("inner2 print outer's num = "+ Outer.count);

       }

   }

 

   public staticvoidmain(String[] args) {

       Outer outer = new Outer();

       Outer.Inner3inner3 =new Outer.Inner3();

       inner3.print();

       outer.print();

   }

}

 

代碼分析:

 

1. 靜態內部類比成員內部類多了一個static修飾符

2. 靜態內部類不依賴於外部類來進行實例化

3. 靜態類不能使用外部類的非static變量 , 要使用的話只能通過實例化一個外部類變量來使用

3. 局部內部類

public class Outer {

   privateInteger count= 0;

 

   public void print() {

       classInner4 extendsOuter {

            privateInteger num= 4;

            public String str() {

                return this.num.toString();

            }

       }

       System.out.println("outer print inner4's num = "+ new Inner4().str());

   }

 

   public staticvoidmain(String[] args) {

       newOuter().print();

   }

}

 

局部內部類是定義在一個方法中或者一個代碼塊裏面的類 , 作用域就在定義該內部類的方法中或者代碼塊

局部內部類不能有public、protected、private以及static修飾符

4.匿名內部類:

 

public abstract class AbstractOuter {

   public abstractInteger count();

}

 

public class Outer {

   public staticvoidprint(AbstractOuter outer) {

       intcount = 10;

       System.out.println("outer print count = "+ outer.count(count));

   }

 

   public staticvoidmain(String[] args) {

       inttoAdd = 10;

       print(newAbstractOuter() {

            @Override

            publicInteger count(intcount) {

                returncount + toAdd;

            }

       });

   }

}

 

代碼分析:

1. 一個抽象類或者接口是沒有辦法直接new的,我們必須要先有實現類才能new出來它的實現類實例。

2. 所以在mian方法中直接使用匿名內部類來創建一個AbstractOuter實例。

3. JDK1.8之前, 內部類要想訪問方法中的參數toAdd, 參數toAdd必須要用final修飾符, 在JDK1.8中可以不加final

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章