2012-08-02 72 views
-3

說我有一個接口I與方法doIt();實例化界面

現在我有一個類C實現I並因此提供了在班doIt();

對於以下代碼的執行Hello

public class Hello{ 
    I i = new I(); 
    i.doIt(); 
} 

1.)現在從哪裏開始執行doIt()?

2.)如果還有另一個類HelloWorld實施I如果doIt()函數的實現不同也會如何。那麼它會採取哪些實施?

+5

你試過編譯這個....編譯器可能有東西要告訴你:) – 2012-08-02 05:37:15

回答

4

嘗試編譯這些東西。您只能實例化一個Class,它實現Interface而不是直接Interface

Interface就像Class同意的合同,它implements它;並且在Interface的協議內,Class提供了它的實現。

2

你不能實例化一個接口。你只能實例化一個具體的類。 doIt()的實現是在實例化的具體類中定義的。如果該類不提供實現,則它將從超類繼承。

作爲旁註,在您的代碼示例中,您的代碼不包含在方法或靜態塊中。這不合法。您必須將代碼放在方法或靜態塊中。

2

接口無法實例化。您發佈的代碼應該是未編譯。你可以做的是這樣的:I c = new C();。這也將確保我會調用doIt()的適當實施。

有關Interfaces的更多信息,請參閱this Oracle教程。

0

沒有實現,您的代碼將無法編譯。嘗試創建一個簡單的工作示例,你會明白。BTW語法錯誤無論如何:如果我是一個接口,你需要打開花括號來創建一個匿名類實現接口:

I i = new I() { public void doIt() {} }; 
0

在你的代碼I i = new I();不正確Iinterface和接口不能被實例,如果你做那麼這應該是

I i = new I(){ 
    public returntype doIt(){ 
    ... 
    } 
}; 

現在上面的實現稱爲匿名內部類here

2

這行不通

public class Hello{ 
    I i = new I(); // I is an interface, can't be instantiated 
    i.doIt(); 
} 

我想你想......

public class A implements I { 
    public void doIt() { 

     System.out.println("A did it"); 

    } 
} 
public class B implements I { 
    public void doIt() { 

     System.out.println("B did it"); 

    } 
} 

public class Main { 
    public static void main(String args[]) { 
     I i = new A(); 
     i.doIt(); 
     i = new B(); 
     i.doIt(); 
    } 
} 

這將輸出

A did it 
B did it 
+0

+1。例如。 – SiB 2012-08-02 05:55:24

1

只有這樣,各地的實例化界面添加匿名內部類型特定於您的實現。雖然它看起來像一個糟糕的設計有時候很有用。乾杯。

II i = new II() { 

     @Override 
     public void doit() { 
      // TODO Auto-generated method stub 

     } 
    };