2010-12-01 116 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