为什么抽象类可以像这样实例化?

San*_*p P 3 java oop abstract-class object

我读到Class和Abstract Class之间的主要区别是,抽象类无法实例化,

但我可以为抽象类创建对象

public abstract class Earth {

    abstract void sand();

    void land() {

    }
}
Run Code Online (Sandbox Code Playgroud)

并使用新的关键词我创建了对象,用于抽象

    Earth mEarth = new Earth() {

        @Override
        void sand() {

        }
   };
Run Code Online (Sandbox Code Playgroud)

我有一些问题在Inet上没有正确答案,

1)是新关键字用于实例类?

2)实例只是对象吗?

3)mEarth被称为对象(地球的实例)?

现在我可以调用任何方法(作为回调或值返回) mEarth.sand(); mEarth.land(); 使用地球物体

Dmi*_*nko 5

您无法创建抽象类:

  new Earth(); // <- that's compile time error
Run Code Online (Sandbox Code Playgroud)

但是,您可以像创建非抽象派生类一样创建

  // New non-abstract (local) class that extends Earth 
  new Earth() {
    // You have to override an abstract method
    @Override
    void sand() {
      ...
    }
  }
Run Code Online (Sandbox Code Playgroud)

问题的答案:

  1. 是的,new关键字创建新实例.
  2. 没有; 创建的实例是一个扩展 Earth类的对象,而不仅仅是Object
  3. mEarth字段声明为Earth并包含一个扩展类的对象Earth,因此您可以调用任何方法Earth.