2

这很好用。

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和从. 这怎么可能? 我期待一个异常,但调用工作正常。 有人可以解释一下这些现象吗?我很困惑。interfacemain()class Impl


Java 抽象类也不能被实例化,但可以在 main() 存在的情况下被调用。

我在博客中读到了这个。这是什么意思?

还有其他方法可以调用抽象类的构造函数吗?请让我知道是否有。

4

2 回答 2

14

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

于 2013-02-20T09:39:35.547 回答
8

如果我这样做:

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

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

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

(它是 的AbstractClass

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

The above is often used to implement simple interfaces/abstract classes in a concise form, often as inner classes within callbacks. See this SO question for more info, and the Nested Class tutorial for more discussion.

于 2013-02-20T09:41:13.153 回答