可以实例化一个抽象类或接口吗?

时间:2013-02-20 09:37:54

标签: java

这很好用。

package abstracttest;

public abstract class AbstractClass implements NewInter {

    public abstract void doStuff();

    public void doStuff2() {
        System.out.println("in doStuff2");
    }

    /*
     * public static void main(String a[]) { AbstractClass ab = new
     * AbstractClass() {
     * 
     * @Override public void doStuff() { // TODO Auto-generated method stub
     * System.out.println(" doStuff "); }
     * 
     * @Override public void doInter() { // TODO Auto-generated method stub
     * 
     * } };
     * 
     * ab.doStuff2(); ab.doStuff();
     * 
     * NewInter ni = new NewInter() {
     * 
     * @Override public void doInter() { // TODO Auto-generated method stub
     * System.out.println("do Inter"); }
     * 
     * }; ni.doInter();
     * 
     * AbstractClass ab1 = new AbstractClass(); }
     */

}

interface NewInter {

    String con = "Hell";

    void doInter();
}

class Impl extends AbstractClass {

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

    }

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

    }

    public static void main(String[] s) {
        AbstractClass ab = new AbstractClass() {

            @Override
            public void doInter() { // TODO Auto-generated method stub
                System.out.println("impl doInter");
            }

            @Override
            public void doStuff() { // TODO Auto-generated method stub
                System.out.println("impl doStuff");
            }

        };
        ab.doInter();
        ab.doStuff();

        NewInter ni1 = new NewInter() {

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

            }
        };
        ni1.doInter();
    }

}

我能够从抽象类“abstract class”和interface中实例化main()class Impl。 这怎么可能?
我期待一个例外,但调用工作正常 有人可以解释一下这种现象吗?我很困惑。

  

Java抽象类也无法实例化,但如果存在main(),则可以调用它。

我在blog中读到了这个内容。这是什么意思?

还有其他方法可以调用抽象类的构造函数吗?如果有,请告诉我。

2 个答案:

答案 0 :(得分:14)

不,你没有实例化它们。您只创建了实现接口或扩展抽象类的匿名类。这些匿名类类型的对象实际上是实例化的。

答案 1 :(得分:8)

如果我这样做:

new AbstractClass() {
   public void methodToImplement() {
   }
}

它正在从抽象类创建一个匿名类派生。它被称为(匿名),因为类定义没有它自己的可访问名称,您无法再次访问该定义。定义/实例化一起发生,例如。

AbstractClass ac = new AbstractClass() {
   ...
}

(它是AbstractClass子类

请注意,您可以对接口和抽象类执行此操作,但您必须适当地实现所需的方法。

以上内容通常用于以简洁的形式实现简单的接口/抽象类,通常作为回调中的内部类。有关详细信息,请参阅this SO question;有关详细讨论,请参阅Nested Class tutorial