深入解析Java构造器:特殊方法、初始化作用及与对象创建关系

构造器是在创建对象时会被自动调用的一种特殊方法,其作用是进行初始化。构造器的名称和类的名称是相同的。
创建对象时,系统会对该对象的属性进行默认初始化。对于基本类型属性,其值为 0(数值类型)或 false(布尔类型)。而对于所有的引用类型,会将其设置为 null。
构造器可以改变这种默认的初始化。
构造器的作用在于它是创建 java 对象的重要途径。那么,是不是意味着构造器就完全负责创建 java 对象呢?
创建 java 对象有重要途径,当通过 new 关键字调用构造器时,构造器会返回该类的对象,然而,这个对象并非完全由构造器来负责创建。
首先要明确的是,Java 的构造器并非函数,因此它不能被继承。在我们使用 extends 关键字编写子类构造器时,这种情况较为常见。即便子类构造器的参数与父类完全相同,我们也必须编写 super,原因就在于此。
构造器的修饰符较为有限,只有 public、private、protected 这三个。其他的,比如任何其他修饰符都不能用于构造器。也就是说,构造器不允许被修饰为除了抽象、同步、静态等访问限制形式之外的其他形式。
构造器不是函数,所以它没有返回值,并且不允许有返回值。这里要说明,构造器中允许有 return 语句。然而,如果 return 语句不返回任何东西。若指定了返回值,尽管编译器不会报错,但 JVM 会将其视为一个与构造器同名的函数。这样就会出现一些莫名其妙且无法找到构造器的错误,对此要加倍留意。
当我们扩展一个子类时,常常会遇到一些意料之外的问题。我在此说一说和构造器相关的一些情况。
首先来讲,关于 Java 在构造实例时的顺序,这里暂不讨论装载类的过程。
*构造的粗略过程如下:*
分配对象空间,接着把对象中的成员初始化为 0 或者空。在 Java 中,不允许用户去操纵一个具有不定值的对象。
执行属性值的显式初始化。这里存在一些变化,稍后会进行解释,不过大致情况就是这样的。
3、执行构造器
4、将变量关联到堆中的对象上
介绍一下准备知识,以备一会来详细说明这个的流程。
this() 和 super() 是在你想要用传入当前构造器的参数或构造器中的数据来调用其他构造器或控制父类构造器时使用的。在一个构造器中,你只能使用 this() 或者 super() 其中的一个,并且调用的位置只能在构造器的第一行。在子类中,如果你希望调用父类的构造器来初始化父类的部分,就用合适的参数来调用 super()。如果你使用没有参数的 super() 来调用父类的构造器(同时也没有使用 this() 来调用其他构造器),父类缺省的构造器会被调用。如果父类没有缺省的构造器,那么编译器就会报一个错误。
注意这里,我们在继承父类时,构造器中通常不写与父类有关的内容。在这种情况下,如果父类没有缺省构造器,就会出现编译器添加的缺省构造器给你带来麻烦的问题。
注:一旦定义了有参构造,无参就必须显示定义
public class Manager extends Employee {
private String department;
public Manager(String name, double salary, String dept)
{
super(name, salary);
department = dept;
}
public Manager(String n, String dept) {
super(name);
department = dept;
}
public Manager(String dept) {
这里不存在 super(),编译器会自动添加一个空参数的缺省 super 构造器。在这种情况下,如果 Employee 类中没有空参数的缺省构造器,就会引发一个编译错误。
department = d;
}
}