-1

我为此道歉,我相信每个人都厌倦了抽象类的问题。

规则/事实:抽象类不能被实例化。

我遇到了一个让我感到困惑的例子:

public abstract class AbstractClass {
    private String name;

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

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

public class Test {
    public static void main(String [] args)
    {
    //breaking rule
        AbstractClass temp = new AbstractClass("name") {
        };

        System.out.println(temp.getName());
    }
}
4

3 回答 3

3

如果这是 java ,那么您将在此处创建扩展此抽象类的匿名类。因为没有抽象方法所以你不需要实现任何方法

于 2013-03-10T15:45:15.277 回答
0

这里的关键是后面的括号new AbstractClass("name")

您正在做的是匿名内部类的实例化。实例化匿名类是不一样的。你在这里没有违反任何规则。也可以使用非抽象类来创建匿名内部类。

这意味着每次运行该部分代码时,您不仅是在创建一个类的新对象,而且实际上是在创建一个新类。

于 2013-03-10T15:51:11.697 回答
0

OP:无法初始化抽象类。它必须扩展成一个具体的类才能被 jvm 初始化。您可以让 Test 扩展 AbstractClass,然后将名称传递给它,但只是在抽象上尝试 new 是行不通的。

编辑:我没有注意到初始化程序上的大括号。上面的答案是正确 new Abstract(){};的确实创建了一个匿名内部。

于 2013-03-10T15:47:06.023 回答