我们可以创建一个抽象的对象class吗?

Can we create an object of abstract class?

我只是对抽象的 class 概念感到困惑。请解开我的疑惑。 Abstract class 的定义说我们不能创建这样的 class 的对象,那么我们称之为 A a = new A() { }。示例如下:

public abstract class AbstractTest {
    public abstract void onClick();
    public void testClick() {

    }
}

public class A {
    AbstractTest test = new AbstractTest() {
        @Override
        public void onClick() {

        }
    };
}

那么test是对象还是什么?

testAbstractTest的一个匿名具体子class的对象(注意它实现了AbstractTest的所有抽象方法),这就是为什么这个子class可以实例化

另一方面,

AbstractTest test = new AbstractTest();

不会通过编译,因为那将是尝试实例化抽象 class。

您混淆了对象和引用。

AbstractTest test = new AbstractTest() {
    @Override
    public void onClick() {
    }
};

test这里引用了一个扩展了AbstractTest的匿名class,上面的代码就像在说:

class MyClass extends AbstractTest {
    @Override
    public void onClick() {
    }
}

AbstractTest test = new MyClass(); // test is a reference to a MyClass object

我认为抽象Class需要和接口一起解释

Interface 允许您在具有该接口的对象上指定 supported/allowed 的操作。更具体地说,对象是实现该接口的 Class 的实例。定义接口允许您描述一组不同的 classes 对象,以便其他对象可以以相同的方式与它们交互。

抽象 Class 是界面和 Class 之间的一个步骤(松散地说)。摘要 Class 允许您指定扩展它的 classes 支持的操作, 但是 它还允许您实现(某些)这些操作。通过这种方式,您可以为该摘要 class 中的一组 class 实现 common 方法。抽象 class 中未实现的其他方法(也称为抽象方法)需要由扩展它的 class 实现。您没有在 Abstract class 上实现所有方法这一事实自然意味着您无法实例化它(创建此类 class 的对象)。还有其他 有用的 抽象 class 实现(即回调)。

在您的示例中,您所看到的是,您实际上并没有真正尝试创建一个抽象对象 class,您还提供了抽象方法 onClick() 的实现;

这是唯一的方法 "create an instance of the abstract class" - 从技术上讲,您正在创建一个匿名 class 的实例(即扩展您的摘要 class)并为其提供实现继承的抽象方法。