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

时间:2014-05-23 06:30:33

标签: java oop object abstract-class

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

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

public abstract class Earth {

    abstract void sand();

    void land() {

    }
}

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

    Earth mEarth = new Earth() {

        @Override
        void sand() {

        }
   };

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

1)是否使用新关键字来实例化该类?

2)实例只是对象吗?

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

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

4 个答案:

答案 0 :(得分:5)

您无法创建抽象类

  new Earth(); // <- that's compile time error

但是,您可以像

那样创建非抽象派生类
  // New non-abstract (local) class that extends Earth 
  new Earth() {
    // You have to override an abstract method
    @Override
    void sand() {
      ...
    }
  }

问题的答案:

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

答案 1 :(得分:1)

 Earth mEarth = new Earth() {

    @Override
    void sand() {

    }
};

mEarth ---参考变量控制,子类对象(地球的匿名子/内部类)
http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

 new Earth() {

    @Override
    void sand() {

    }
};

没有名字的班级

1)是否使用新关键字来实例化该类? A)是的

2)实例只是对象吗? A)是

3)mEarth被称为对象(地球的实例)? A)mEarth是引用变量保持子类(匿名实现)对象

答案 2 :(得分:1)

这可以帮到你:

没有好友,你没有在这里创建Abstract Class的实例。
而是在创建Anonymous Subclass Abstract Class的实例。
然后你在抽象类引用上调用指向子类对象的方法。

= new Earth() {};表示存在匿名实现,而不是对象的简单实例化,对象应该像= new Earth();一样。抽象类型主要定义为可以&#39 ;创造。我们可以创建它的子类型,但不能创建它本身的子类型。

答案 3 :(得分:1)

1)是的确如此。虽然它并不是最常见的(也是我认为安全的)唯一的方式。

2)据我所知也是。实例意味着您具有类的特殊方面,意味着其实例成员的值(局部变量)等。这些值特定于每个对象的实例。

3)在这里,您要创建一个Earth的匿名子类的对象(因为Earth是抽象的,无法实例化)。这意味着您不必专门为您的子类命名,只需提供sand()的实现,以便具体(并且可以实例化)。