2017-08-26 80 views
2

我知道接口是:僅創建接口實例的目的是什麼?

1)接口是即模板

2)接口類型可以指類的一個對象,其實現該接口的方法清單。

今天我碰到下面的代碼

interface Test 
{ 
    void greet(); 
} 
public class Demo 
{ 
    public static void main(String[] args) 
    { 
    Test t = new Test() ---> Is it correct ? WHY ? 
    { 
     public void greet() 
     { 
     System.out.print("\nHi, Best wishes to way2java.com\n"); 
     } 
    }; 
    t.greet(); 
    } 
} 

我不能夠理解下面的代碼片段

Test t = new Test() 

1意向)不要接口有構造函數?我的知識表示界面方面則只有方法列表,但不是定義

2)是合法的創建界面的對象?我的知識說,接口類型只能引用實現該接口的類的對象。

3)如果其法律然後什麼目的?

謝謝

+0

我相信這是內聯工具的格式。因爲它們都調用它的新實例,然後實現在其中定義的方法列表。這裏 – fjoe

回答

1

1)不,他們不。

2)號

你所創建這裏是實現你的接口匿名類 - 請注意,您被迫實施greet方法。

有在你的代碼情況下,你根本不關心給你實現一個特定的名稱 - 那麼你可以通過匿名內部類 - 在Java中的lambda表達式的整個概念是基於此。

比方說,你想用的forEach方法打印列表的內容:

Arrays.asList(1, 2, 3) 
    .forEach(...); 

forEach接受Consumer實例,它是一個接口。所以,你可以創建自己的等級:

class IntegerPrinter implements Consumer<Integer> { 

@Override 
public void accept(Integer integer) { 
    System.out.println(integer); 
} 

但是這太瑣碎創建一個新的類,因此它可以通過一個匿名實例,而不是:

Arrays.asList(1, 2, 3) 
    .forEach(new Consumer<Integer>() { 
     @Override 
     public void accept(Integer integer) { 
      System.out.println(integer); 
     } 
    }); 

一點點更好但仍相當冗長。這是lambda表達式派上用場的地方:

Arrays.asList(1, 2, 3) 
    .forEach(integer -> System.out.println(integer)); 
+0

匿名類,你的意思是,任何隨機類(在這種情況下,它的測試),如果我們建立這樣的一個實例的JVM造成的。在後端,一些隨機類總是存在,它正在實現Test界面。我們這樣做是爲了減少創建一個正在實現(Test)接口的新類的努力。我的理解是否正確? – LearnJava

+1

@LearnJava是的,但在這一天結束時,你無論如何都會實現,但你是不是給這個類的名稱。 –

相關問題