【问题标题】:Why can abstract class be instantiated like this?为什么抽象类可以这样实例化?
【发布时间】:2014-07-12 09:52:40
【问题描述】:

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

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

public abstract class Earth {

    abstract void sand();

    void land() {

    }
}

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

    Earth mEarth = new Earth() {

        @Override
        void sand() {

        }
   };

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

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

2) 实例只是对象吗?

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

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

【问题讨论】:

  • 如果 Earth 是抽象类,你不能这样做 new Earth();。但是你可以创建一个派生类
  • 我们不能像 new Earth();但我们可以像我上面提到的那样做!
  • 您正在制作的是Earth 的匿名子类。不直接实例化Earth
  • 当您使用 {@Override} 时,您正在为 Earth 类创建一个新的匿名类。当您使用 Earth mEarth = new Earth() 时,您会发现无法创建抽象类。 new 关键字确实用于创建类实例。对象是什么取决于您对对象的定义。 mEarth 是 Object 的子类,因为您将创建的所有类都是 Object 的子类。 mEarth 是对地球实例的引用。地球本身是一个类,但这也是一个真实的对象。

标签: java oop object abstract-class


【解决方案1】:

你不能创建一个抽象类

  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 的任何方法。

【讨论】:

    【解决方案2】:

    1) 是的。虽然这不是最常见(我认为也是安全)的唯一方法。

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

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

    【讨论】:

      【解决方案3】:

      希望对您有所帮助:

      不,伙计,您不是在这里创建Abstract Class 的实例。
      相反,您正在创建Abstract ClassAnonymous Subclass 的实例。
      然后您在指向子类对象的抽象类引用上调用该方法。

      = new Earth() {}; 表示存在匿名实现,而不是对象的简单实例化,对象应该像= new Earth();
      抽象类型在很大程度上定义为无法创建的类型。我们可以创建它的子类型,但不能创建该类型本身。

      【讨论】:

        【解决方案4】:
         Earth mEarth = new Earth() {
        
            @Override
            void sand() {
        
            }
        };
        

        mEarth --- 引用变量持有,子类对象(地球的匿名子/内部类)
        http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

         new Earth() {
        
            @Override
            void sand() {
        
            }
        };
        

        是没有名字的类

        1) new 关键字是否用于实例化类?
        A) 是的

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

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

        【讨论】:

          猜你喜欢
          • 2022-07-22
          • 1970-01-01
          • 2013-05-05
          • 1970-01-01
          • 2019-09-07
          • 2015-03-19
          • 2020-11-21
          • 2011-09-10
          相关资源
          最近更新 更多