java中匿名類例題的簡要分析

在學習java的繼承的過程中遇到這樣的一個分析類題目,比較有意思,在這裏做出簡要分析:

//請寫出以下程序運行結果:

package test;
public class Test {
   public static void main(String[] args) {
      Test t = new Test();
      t.show(new Car(){
         public void run(){
            System.out.println("test run");           
         }
      });
   }
   public void show(Car c){
      c.run();
      c.show();
}}
abstract class Car{
   public void run(){
      System.out.println("car run");     
   }
   public void show(){
       System.out.println(getClass().getName());
}}

那麼,我們可以通過斷點的分析:

  1. 首先。我們從main函數進入,發現他創建了Test類的一個對象t;

    我們在test類中並沒有尋找到Test類的構造函數,所以應該是系統默認的構造器,不進行任何的行爲;

  2. 之後,我們注意一下這一步,首先是t.show()方法,在Test的類中有這麼一個方法,不過我們看到show方法是需要傳入一個car類的對象,所以他new了一個car對象,離奇的是car對象後面接着一對大括號。

  3. 注意到:這裏有一個匿名類,用來一次性使用的創建car對象。這樣抽象類car才能被以匿名類中的內容實例化。這樣,我們就完成了對car類的實例化,得到了一個car類的對象。

在這裏插入圖片描述

  1. 接着,我們以那個新new的對象作爲參數,調用了Test類中的show方法。

在這裏插入圖片描述

而show方法的第一條語句是c.show();注意到我們是通過匿名類創建的對象,而我們是通過匿名類中的重新寫的run()方法,所以他又跳回了第六行,輸出“test run”;

在這裏插入圖片描述

  1. 好的,接下來我們又回到了show方法中,繼續調用c.show(),這時,我們回頭看匿名類,它裏面竟然沒有show的方法。。。所以他就只能調用car類的show()方法。

    在這裏插入圖片描述

  2. 注意到了右側返回的getName()是"test.Test$1",好吧,test是包名,Test是類名,可以理解!

    但是$1就使得不少同學迷惑了。

    在這裏插入圖片描述

  3. 好的,我們這次打開文件管理系統,找到我們編譯的文件所在,發現.java編譯後多出了Test$1.class的文件,這個.class是怎麼來的呢?對了是匿名類!這裏的Test$1這個類名是編譯器給它的名字(匿名類沒有名字,但是java編譯器要給他起個名,纔好分辨)而命名的格式就是第一個Test類下面的匿名類的話就叫$1,第二個就是$2。

在這裏插入圖片描述

在這裏插入圖片描述

這樣就可以了,程序就結束了!主要涉及了匿名成員類。大家有興趣(最好可以瞭解一下)

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