抽象类强制实例化java

抽象类强制实例化java,java,abstract,rules,Java,Abstract,Rules,我们知道在java中不能创建抽象类的实例。 但是,这是可行的: public abstract class MyAbstract { int num = 10; } //and in main class public static void main(String[] args) { MyAbstract abstractObject = new MyAbstract() {}; System.out.println(abstr

我们知道在java中不能创建抽象类的实例。 但是,这是可行的:

public abstract class MyAbstract 
{
    int num  = 10;
}
//and in main class

    public static void main(String[] args) {        
       MyAbstract abstractObject = new MyAbstract() {};
       System.out.println(abstractObject.num);       
    }
输出: 运行: 十,

那么我们可以吗? 简而言之,这里发生了什么?

语法

new X(...) { ... }
实例化一个特殊的匿名类,扩展/实现名为X的类/接口

在您的例子中,抽象类拥有它所需要的一切,没有抽象方法。因此,派生类不需要实现任何缺少的方法

如果将抽象方法添加到抽象类中,则示例将不再有效。要使它再次工作,您必须在{…}部分实现该方法

public abstract class MyAbstract 
{
    int num  = 10;
    abstract void f();
}

public static void main(String[] args) {        
    MyAbstract abstractObject = new MyAbstract() {
        void f() {
            ...
        }
    };
    System.out.println(abstractObject.num);       
}
此外,可以使用语法的()部分将参数传递给扩展基类的构造函数:

public abstract class MyAbstract 
{
    MyAbstract(int argument) {
        ...
    }
    int num  = 10;
    abstract void f();
}

public static void main(String[] args) {        
    MyAbstract abstractObject = new MyAbstract(5) {
        void f() {
            ...
        }
    };
    System.out.println(abstractObject.num);       
}

myabstractobject=newmyabstract(){}
创建
MyAbstractClass
的新子类。那个子类的名称?没有。这就是为什么它被称为匿名类。