如何创建抽象类和接口的对象

时间:2010-12-01 05:10:31

标签: java interface abstract-class

如何创建抽象类和接口的对象?我知道我们不能直接实例化抽象类的对象。

12 个答案:

答案 0 :(得分:13)

您无法实例化抽象类或接口 - 您可以实例化其子类/实现者之一。

这种事情的例子在使用Java Collections时是典型的。

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

您使用的是接口类型List<T>作为类型,但实例本身是ArrayList<T>

答案 1 :(得分:9)

要创建抽象类的对象,只需使用 new ,就像创建其他非抽象类的对象一样,只有一个小差异,如下所示:

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();
    }

}

答案 2 :(得分:4)

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

答案 3 :(得分:4)

您可以将实现提供为匿名类:

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

同样,匿名类可以扩展父类而不是实现接口(但它不能同时执行这两种操作)。

答案 4 :(得分:3)

有两种方法可以实现这一目标。

1)您可以在新类中扩展/实现Abstract类/接口,创建此新类的对象,然后根据需要使用此对象。

2)编译器允许您在代码中创建接口的匿名对象。

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

希望这有帮助。

此致 Mahendra Liya。

答案 5 :(得分:2)

您编写一个派生自抽象类的类或实现该接口,然后实例化该类。

答案 6 :(得分:2)

“instantiate”的意思是“创建一个对象”。

所以你不能直接创建一个。

接口和抽象类的目的是描述实现接口或扩展抽象类的一些具体类的行为。

实现接口的类可以被其他只知道接口的代码使用,这可以帮助您分离责任,并清楚地了解您希望从对象中获得什么。 (调用代码只知道对象可以执行接口中指定的任何操作;它不会知道它拥有的任何其他方法。)

如果你正在使用其他需要Fooable的代码(这是某个接口的名称),那么你并不是真的被要求提供某个Fooable类的对象(因为实际上没有一类)。您只被要求提供一个实现Fooable的类的实例,即声明它可以执行该接口中的所有操作。简而言之,“可以被Foo'd”。

答案 7 :(得分:2)

你知道的是正确的。您不能创建抽象类或接口的对象,因为它们是不完整的类(接口甚至不被视为类。)

你可以做的是实现抽象类的子类,当然,它不能是抽象的。对于接口,您必须创建一个实现接口的类并实现接口方法的主体。

以下是oracle网站上的原始教程,http://download.oracle.com/javase/tutorial/java/IandI/abstract.htmlhttp://download.oracle.com/javase/tutorial/java/concepts/interface.html

答案 8 :(得分: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 { ... }

答案 9 :(得分:1)

不,我们不能从接口或Abstract类创建对象,因为

创建对象的主要目的是利用包装的方法和数据。 由于接口没有任何具体的实现,因此我们不能。

对于抽象类,我们可能有具体方法或抽象方法或两者。 API开发人员无法限制使用没有实现的方法。

希望有所帮助。

答案 10 :(得分:1)

您无法实例化抽象类或接口 - 您可以实例化其子类/实现者之一

您无法实例化一个抽象类或接口,只能实例化其派生类之一。

在你的例子中

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

您正在实例化任何实现惊喜的类

答案 11 :(得分:0)

不,您不是在这里创建抽象类的实例。而是在创建抽象类的匿名子类的实例。然后,您在指向子类对象的抽象类引用上调用该方法。