【问题标题】:If constructor not build the object what is used to make the object?如果构造函数不构建对象,则使用什么来制作对象?
【发布时间】:2018-02-21 05:59:16
【问题描述】:

据此Can an abstract class have a constructor? constructorbuild 对象,它用于初始化字段,那么用于构建对象的对象是什么? 与 抽象类 一样,构造函数存在,不允许从该类创建实例,只能继承它。
所以问题是

在java中真正构建对象的是什么??

【问题讨论】:

标签: java oop constructor


【解决方案1】:

每次使用 new 关键字时,都会在 Java 中创建一个对象实例。例如,

MyClass myObject1 = new MyClass("John", 1, 1000.20);
MyClass myObject2 = new MyClass("Mary", 2, 200);
MyClass myObject3 = new MyClass();

但是,您只能实例化一个 具体 类,而从不 抽象 类。那么问题来了,有一个抽象类有什么意义呢?

你有一个抽象类来提供一组通用的功能,这些功能可以被它的所有子类共享,例如属性、字段等。

当然,抽象也可以有构造函数。如果您没有显式提供构造函数,它将有一个默认构造函数。每当实例化其具体子类之一时,子类的构造函数将在其自己的构造函数中执行任何类型的工作之前调用超级构造函数。例如,

public abstract class MyAbstractClass {
   private String name;

   private int age;

   public MyAbstractClass() {
       name = "bozo";
       age = 5;
   }

  public MyAbstractClass(String name, int age) {
      this.name = name;
      this.age = age;
  }
  ...
}

public class MyClass extends MyAbstractClass {
    private double income;

    public MyClass() {
        //calls super() implicitly.
    }

    public MyClass(String name, int age, double income) {
        //calls super explicitly
        super(name, age);
        this.income = income;
    }
}

【讨论】:

    【解决方案2】:

    任何类都必须有构造函数。

    所有类(抽象如具体)都必须声明一个构造函数。
    它可能是生成的无参数构造函数或显式声明的构造函数,但无论如何,构造函数的存在是强制性的。
    为什么?
    因为对于从一个类继承的任何类(即:除Object 之外的所有类),任何被调用的构造函数的第一条语句都是调用直接父构造函数,它可以依次调用其父构造函数,依此类推。

    使用new 运算符创建实例

    当您要创建特定类的实例时,您必须通过在其前面加上 new 运算符来调用其类的构造函数:

    new MyObject();
    

    但它只对具体类有意义。

    确实,抽象类无法实例化

    因此,将使用抽象类的构造函数,但仅在您创建此抽象类的子类的实例(无论其在层次结构中的级别如何)时(我在第一点中解释过)。

    假设Child是具体的Parent是抽象的,你必须Child构造函数中调用Child的父构造函数:

     Child(){super();}
    

    但您永远不会调用new Parent(),因为实例化抽象类是不合法的。

    【讨论】:

    • 值得注意的是英语不是你的第一语言,有时会出现“有趣”的语法......但我认为技术内容很好。
    • 你总是很好:)
    【解决方案3】:

    新的 Operator 确实构建了 Object。

    抽象类总是有构造函数(显式或隐式)的原因是因为它不是从抽象子类调用的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 2018-01-29
      • 2013-10-20
      • 2021-10-22
      相关资源
      最近更新 更多