[英]If constructor not build the object what is used to make the object?
据此, 抽象类可以具有构造函数吗? 构造函数不构建对象,而是用于初始化字段的,那么用于构建对象的是什么? 与抽象类一样 ,构造函数也存在,并且不允许从该类中创建实例,而只能继承它。
所以问题是
真正在Java中构建对象的是什么?
每次您使用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;
}
}
构造函数对于任何类都是必需的。
所有类(像混凝土一样抽象)都必须声明一个构造函数。
它可能是未生成的arg构造函数,也可能是显式声明的构造函数,但是无论如何,构造函数的存在是强制性的。
为什么呢
因为对于从类继承的任何类(即,除Object
所有类),任何调用的构造函数的第一条语句都在调用直接父构造函数,而后者又可能调用其父构造函数,依此类推。
使用new
运算符创建实例
当您要创建特定类的实例时,必须通过在类的构造函数前添加new
运算符来调用该类的构造函数:
new MyObject();
但这仅对具体的类有意义。
确实,抽象类无法实例化
因此,将仅使用抽象类的构造函数,但仅当您创建该抽象类的子类(无论其层次结构中的级别)的实例时(我在第一点中已经解释过)。
假设Child
是具体的而Parent
是抽象的,则必须在Child
构造函数中调用Child
的父构造函数:
Child(){super();}
但是您永远不会调用new Parent()
因为实例化抽象类是不合法的。
新的操作员确实可以构建对象。
抽象类始终具有构造函数(显式或隐式)的原因是因为它不是抽象子类而被调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.