根据这个Can an abstract class have a constructor?
构造函数不构建对象,它用于初始化字段,以便用于构建对象?
与抽象类一样,构造函数存在,并且不允许从该类生成实例,只能继承它。
所以问题是
在java中真正构建对象的是什么?
答案 0 :(得分:3)
每次使用 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;
}
}
答案 1 :(得分:2)
任何类都必须使用构造函数。
所有类(抽象如具体)都必须声明构造函数
它可能是生成的无arg构造函数或显式声明的构造函数,但无论如何,构造函数的存在是强制性的
为什么?
因为对于从类继承的任何类(即:除了Object
之外的所有类),任何被调用的构造函数的第一个语句都在调用直接的父构造函数,它可能会调用其父构造函数,依此类推点。
使用new
运算符创建实例
当您想要创建特定类的实例时,您必须通过在其前面添加new
运算符来调用其类的构造函数:
new MyObject();
但这只适用于具体的课程。
的确,抽象类无法实例化
因此,将使用抽象类的构造函数,但仅在您创建此抽象类的子类的实例(无论其在层次结构中的级别)时(我在第一点中解释过)。
假设Child
具体而且Parent
是抽象的,您必须在Child
构造函数中调用Child
的父构造函数:< / p>
Child(){super();}
但是你永远不会调用new Parent()
,因为实例化一个抽象类是不合法的。
答案 2 :(得分:1)
新的运营商确实构建了对象。
抽象类总是有一个构造函数(显式或隐式)的原因是因为它是从它调用的而不是抽象的子类。