【发布时间】:2014-12-09 09:27:28
【问题描述】:
在下面的代码中,我有一个用户定义的构造函数(无 arg 构造函数)和一个参数化构造函数。
我的理解是,如果我至少有一个构造函数,编译器不会添加默认/隐式构造函数。
我的问题:
在主方法中,我通过调用参数化构造函数来创建Employee 对象。在参数化构造函数中,我只设置了empId 属性。
当我尝试打印 name 的值时,它会将其打印为 null(即默认值)。
什么将 name 初始化为 NULL(即其默认值)? 它不能是编译器生成的隐式/默认构造函数,因为我们在类中至少有一个构造函数。
public class Employee {
String name;
int empId;
public Employee() {
System.out.println("Calling User Defined Constructor");
}
@Override
public String toString() {
return "name=" + name + " empId=" + empId;
}
public Employee(String name, int empId) {
this.empId = empId;
}
public static void main(String[] args) {
Employee e = new Employee("test",123);
System.out.println(e);
}
}
【问题讨论】:
-
字段的默认值不是由任何Java代码分配的;它是虚拟机在开始执行构造函数之前本机初始化对象的内存。如果不这样做,可能会从已经 gc'ed 的对象中读取虚假数据,这将是一种安全风险,尤其是对于对象引用。
-
'我只是在设置 empId 属性' - 如果没有 setter 和 getter,你如何设置 empId 值?
-
this.empId = empId;:) -
我的假设是在任何构造函数调用之后变量被初始化为默认值。所以你的意思是即使在构造函数被调用之前,VM 也会将实例变量默认为某个值??
标签: java constructor