程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> java學習中,成員內部類、匿名內部類(java 學習中的小記錄),java匿名

java學習中,成員內部類、匿名內部類(java 學習中的小記錄),java匿名

編輯:JAVA綜合教程

java學習中,成員內部類、匿名內部類(java 學習中的小記錄),java匿名


java學習中,成員內部類、匿名內部類(java 學習中的小記錄)作者:王可利(Star·星星)

 

內部類:

一個類中定義另外一個類,這樣的類叫內部類。

內部類的文件名:外部類名$內部類名.class   

 

內部類分兩種:

    1.成員內部類

        如何訪問成員內部類:

            方式1:外部類中定義一個方法來創建內部類對象,再通過對象進行訪問。

            方式2:可以直接在其他類中直接創建內部類這個對象,通過對象訪問。用點語。

                      格式:外部類名.內部類名  對象名 = new 外部類名().new 內部類名(); 

        內部類使用的注意事項:

            1.如果外部類和內部類中有同名的成員變量,那麼在內部類中java虛擬機默認訪問內部類中的成員變量,可以通過格式: 外部類名.this.變量名。

            2.如果內部類中的成員被private 修飾了,那麼只能用方式1 來訪問內部類的成員。

            3.內部類中有變量被 static 修飾了,那麼這個類也必須是一個靜態的類。

        內部類使用的好處:

            內部類中是可以直接訪問外部類的所有成員。實際上還是外部類自己調用的。外部類擁有內部類。

         一般什麼時候使用內部類:

             我們在描述一個A對象,發現A對象中又需要有一個對象B,對象B很復雜,B對象又想訪問A中的數據。這個時候用內部類來描述B對象就更方便了。

             又比如說:人有心髒,人也有血液。人是一個類,心髒是一個類,血液也是一個類。 那麼心髒想訪問血液的話就很麻煩。

 1 package study;
 2 
 3 class Outer {
 4     
 5     int i = 10;//自帶的成員變量 外部類
 6     
 7     //定義一個內部類
 8     //成員內部類
 9     class Inner{
10         
11         int i = 20;//內部類的變量
12         
13         public void print() {
14             System.out.println("這個是內部類"+i);//打印的是20
15             System.out.println("這個是內部類"+Outer.this.i);//訪問的是外部類的屬性
16         }
17     }
18     //創建一個方法來創建內部類對象(方式1)
19 /*    public void instantce(){
20         //創建內部類對象
21         Inner inner = new Inner();
22         inner.print();    
23     }*/
24 }
25 //其他類
26 public class star {
27     public static void main(String[] args) {    
28 /*        //在其他類中訪問內部類(方式1)
29         Outer outer= new Outer();
30         outer.instantce();*/
31         
32         //其他類中直接訪問:(方式2)
33         Outer.Inner inner = new Outer().new Inner();
34         inner.print();
35         
36    }
37 }

    2.局部內部類

        局部內部類:在類方法中定義的類,這樣的一個類叫局部內部類。

        局部內部類只能通過第一種方式來訪問。

        局部內部類使用注意點:

            如果局部內部類訪問了方法中的局部變量,方法中的局部內部類必須用final來修飾。

 1 class Outer{
 2     String name = "外部類的name";
 3     int i = 20; 
 4     
 5     public void test() {
 6         
 7         final int i = 30;//局部變量 出了這個方法就消失。
 8         //為什麼要用final來修飾?
 9         /*test方法執行完,變量i 立馬從內存中消失,而inner對象在方法執行完之後,沒有消失的,這裡再使用i就好比把i的生命周期延遲了,與局部變量的定義不符。
10          *所以用final修飾,相當於把i設置了一個復制品給test方法使用,真實的i已經消失。
11          * */
12         
13         //局部內部類
14         class Inner{
15             public void print(){
16                 /*int i = 10; 注銷之後研究拿到30這個i*/
17                 System.out.println("這個是局部內部類的方法"+i);//打印的是10
18             }
19         }
20         //創建局部對象
21         Inner inner = new Inner();//test走完,這個對象可能還存在(它是由java虛擬機決定消除的,不知道是什麼時候),存在的話相當於給 i 的生命周期延遲了。
22         inner.print();
23     }    
24 }
25 
26 public class Star {
27 
28     public static void main(String[] args) {
29         //在其他類中訪問局部內部類
30         Outer out = new Outer();
31         out.test();
32         
33         //下面是錯誤的寫法
34         /*Outer.Inner inner = new Outer().new Inner();
35         inner.print();*/
36     }
37 }

匿名的內部類(沒有類名的類)

好處:簡化書寫

匿名內部類使用前提:外部類必須有繼承或者實現關系。

因為它沒有名字,它實際創建出來是靠父類來創建的,以多態表現出來的。所以要繼承或實現關系。

它的實現實際以多態的形式表現的所以需要滿足上面的條件。

匿名內部類一般用於實際參數的傳遞。(和匿名對象用法一樣)

abstract class Animal{
    public abstract void run();
    public abstract void sleep();
}

//外部類
//在Outer裡面創建一個Dog的內部類
class Outer{
    
    //不用匿名
    /*class Dog extends Animal{
        public void run() {
            System.out.println("狗在跑");
        }
        public void sleep() {
            System.out.println("狗在睡覺");
        }
    }*/
    

    public void print(){
        //Dog d = new Dog();
        //d.run();
        
        //匿名的Dog(通過父類來完成創建)
        //匿名內部類:只是沒有名字,其它的和普通的類沒什麼不一樣
        Animal a = new Animal(){//不是父類創建對象 匿名內部類(子類)
            //具體實現
            public void run(){
                System.out.println("狗在跑");
            };
            public void sleep(){
                System.out.println("狗在睡覺");
            };
        };
        a.run();
        a.sleep();
    };
}
 
public class Star {

    public static void main(String[] args) {
        Outer out = new Outer();
        out.print();
        
    }
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved