2010-12-01 77 views

回答

2

你寫的是從抽象類派生或實現接口,然後實例化一個類。

13

你不能實例化一個抽象類或接口 - 你可以實例化它們的一個子類/實現者。

這種事情的例子在使用Java集合時很典型。

List<String> stringList = new ArrayList<String>(); 

您正在使用的接口類型List<T>作爲類型,但實例本身就是一個ArrayList<T>

1
public abstract class AbstractClass { ... } 

public interface InterfaceClass { ... } 

// This is the concrete class that extends the abstract class above and 
// implements the interface above. You will have to make sure that you implement 
// any abstract methods from the AbstractClass and implement all method definitions 
// from the InterfaceClass 
public class Foo extends AbstractClass implements InterfaceClass { ... } 
3
public abstract class Foo { public abstract void foo(); } 
public interface Bar { public void bar(); } 
public class Winner extends Foo implements Bar { 
    @Override public void foo() { } 
    @Override public void bar() { } 
} 
new Winner(); // OK 
+0

FOO()在抽象類方法需要關鍵字抽象的任何一類,否則拋出編譯時錯誤。它應該像public void foo(); – user609239 2011-08-02 07:05:29

4

可以提供一個實現作爲一個匿名類:

new SomeInterface() { 
    public void foo(){ 
     // an implementation of an interface method 
    } 
}; 

同樣,一個匿名類可以擴展,而不是實現一個接口父類(但不能兩者都做)。

2

「實例化」的意思是「創建一個對象」。

所以你不能直接創建一個。

接口和抽象類的目的是描述一些實現接口或擴展抽象類的具體類的行爲。

一個實現接口的類可以被其他只知道接口的代碼使用,它可以幫助你分離責任,並且清楚你想從對象中得到什麼。 (調用代碼只知道該對象可以執行接口中指定的任何操作;它不會知道其他任何方法)。

如果您使用的其他人的代碼需要Fooable(這是某些接口的名稱),你並不是真的被要求提供某個Fooable類的對象(因爲沒有真正的類)。你只被要求提供一個實現Fooable的類的實例,即它聲明它可以完成該接口中的所有事情。總之,「可以成爲Foo'd」。

2

你知道的是正確的。您不能創建抽象類或接口的對象,因爲它們是不完整的類(接口甚至不被視爲類)。

您可以做的是實現抽象類的子類,當然,它不一定是抽象。對於接口,您必須創建一個實現接口並實現接口方法體的類。

下面是在Oracle的網站,http://download.oracle.com/javase/tutorial/java/IandI/abstract.htmlhttp://download.oracle.com/javase/tutorial/java/concepts/interface.html

2

有您能做到這一點兩種方法原單教程。

1)要麼在新類中擴展/實現Abstract類/接口,請創建此類的對象,然後根據需要使用此對象。

2)編譯器允許您在代碼中創建接口的匿名對象。

例如, (new Runnable(){...});

希望這會有所幫助。

Regards, Mahendra Liya。

8

要創建一個抽象類的對象只是使用就像只用一個小的差異創建其他非抽象類的對象,如下所示:

package com.my.test; 

public abstract class MyAbstractClass { 
    private String name; 

    public MyAbstractClass(String name) 
    { 
     this.name = name; 
    } 

    public String getName(){ 
     return this.name; 
    } 


} 

package com.my.test; 

public class MyTestClass { 

    public static void main(String [] args) 
    { 
     MyAbstractClass ABC = new MyAbstractClass("name") { 
     }; 

     System.out.println(ABC.getName()); 
    } 

} 

以同樣的方式,您可以創建一個對象接口類型,就像如下:

package com.my.test; 

public interface MyInterface { 

    void doSome(); 
    public abstract void go(); 

} 

package com.my.test; 

public class MyTestClass { 

    public static void main(String [] args) 
    { 

     MyInterface myInterface = new MyInterface() { 

      @Override 
      public void go() { 
       System.out.println("Go ..."); 

      } 

      @Override 
      public void doSome() { 
       System.out.println("Do ..."); 

      } 
     }; 

     myInterface.doSome(); 
     myInterface.go(); 
    } 

} 
+10

這不是抽象類或接口的對象。這是一個匿名類,擴展(實現)所述抽象類(接口)。巨大的概念差異。 – Deltharis 2014-09-22 10:59:30

0

NO,我們不能創建對象出接口或抽象類的,因爲

創建對象的主要目的是利用包裝的方法和數據。因爲接口沒有任何具體的實現,所以我們不能。

對於抽象類,我們可能會有具體的方法或抽象方法或兩者兼有。 API開發人員無法限制使用沒有實現的方法。

希望有所幫助。

+0

您可以使用匿名類創建接口和抽象類的對象,請參閱http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html – Simmant 2014-07-11 11:06:04

0

不,你沒有在這裏創建你的抽象類的實例。而是創建一個抽象類的匿名子類的實例。然後你調用指向子類對象的抽象類引用的方法。

0

你不能實例化抽象類或接口 - 你可以實例及其子類/實施者

的一個你不能實例化一個抽象類或接口只能實例化的派生類中的一個。

在您的例子

MyAbstractClass ABC = new MyAbstractClass("name") { 
    }; 

你實例化一個實現Suprising