2012-07-18 102 views
0
// Concrete implementation built atop skeletal implementation 
    static List<Integer> intArrayAsList(final int[] a) { 
    if (a == null) 
     throw new NullPointerException(); 
    return new AbstractList<Integer>() { 
     public Integer get(int i) { 
     return a[i]; // Autoboxing 
     } 

     @Override 
     public Integer set(int i, Integer val) { 
     int oldVal = a[i]; 
     a[i] = val; // Auto-unboxing 
     return oldVal; // Autoboxing 
     } 

     public int size() { 
     return a.length; 
     } 
    }; 
    } 

到目前爲止,我知道我們根本不能實例化一個抽象類。但是我們在return new AbstractList<Integer>()這裏沒有做同樣的事情嗎?我很困惑 。我們是否在這裏實例化一個Abstract類?

+8

這是你的抽象類的**匿名內部子類**的一個實例。 – 2012-07-18 15:20:29

+0

它看起來像一個靜態方法 – 2012-07-18 15:20:42

+0

@MarkoTopolnik我也認爲它是一個匿名的子類,但爲什麼這裏沒有擴展'關鍵字'? – Geek 2012-07-18 15:22:06

回答

2

沒有,你正在創建一個匿名。你是你的抽象類的子類,你提供了一個實現並同時實例化它。

如果你試試這個:

return new AbstractList<Integer>(); 

你會得到一個錯誤,因爲你不會提供具體的實現。

如果您感到困惑,您可以隨時查看官方教程。它是: Java Inner Classes

+0

爲什麼關鍵字'extends'缺失? – Geek 2012-07-18 15:24:04

+0

@Makoto當然我是繼承....遵循'@ Override'註釋。沒有繼承就無法重寫。 – Geek 2012-07-18 15:26:48

+0

在這種情況下是隱含的。 – 2013-05-13 23:46:21

0

不,它沒有實例化一個抽象類,因爲代碼爲該類提供了一個實現。它就像一個匿名的內部類。

就像信息一樣,所有類型的內部類都在編譯過程後生成一個.class文件。所以,代碼:

Test.java

public class Test { 

    abstract class Foo { 
     abstract void foo(); 
    } 

    public Foo bar() { 
     return new Foo() { 
      @Override 
      void foo() { 
       System.out.println("foo!!!"); 
      } 
     }; 
    } 

    public static void main(String[] args) { 
     new Test().bar().foo(); 
    } 

} 

會生成:

  • 的Test.class:公共類的文件(Test.java)
  • 測試$ Foo.class:Test類中的抽象內部類。
  • Test $ 1.class:在bar方法中編碼的匿名內部類。
1

您正在創建一個匿名類,它繼承了抽象類。 您需要將Abstract類的所有抽象方法實現爲匿名類。

0

,您正在創建一個匿名類。

代碼:

return new AbstractList<Integer>() { 
    public Integer get(int i) { 
     return a[i]; // Autoboxing 
    } 

    @Override 
    public Integer set(int i, Integer val) { 
     int oldVal = a[i]; 
     a[i] = val; // Auto-unboxing 
     return oldVal; // Autoboxing 
    } 

    public int size() { 
     return a.length; 
    } 
}; 

是Equivilent到:

... 

return new myNewClass() 

... 


public class myNewClass extends AbstractList<Integer>{ 
    public Integer get(int i) { 
     return a[i]; // Autoboxing 
    } 

    @Override 
    public Integer set(int i, Integer val) { 
     int oldVal = a[i]; 
     a[i] = val; // Auto-unboxing 
     return oldVal; // Autoboxing 
    } 

    public int size() { 
     return a.length; 
    } 
} 
相關問題