在下面的代码中,我有一个用户定义的构造函数(没有arg构造函数)和一个参数化的构造函数。
据我所知,如果我至少有一个构造函数,编译器将不会添加默认/隐式构造函数。
我的问题:
在main方法中,我通过调用参数化构造函数创建Employee
对象。在参数化构造函数中,我只设置empId
属性。
当我尝试打印 name 的值时,会将其打印为null(即默认值)。
将名称初始化为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);
}
}
答案 0 :(得分:2)
引用类型的类变量的默认值为null(与不具有默认值的局部变量相对)。同样,基元类型的类变量也有自己的默认值。
您的代码相当于:
public class Employee {
String name = null;
int empId = 0;
...
}
答案 1 :(得分:0)
救援的JLS,JLS 4.12.5. Initial Values of Variables:
对于所有引用类型(§4.3),默认值为null。
由于String
是引用类型,因此它会null
作为默认值:
ReferenceType:
ClassOrInterfaceType
TypeVariable
ArrayType
考虑在构造函数中分配它:
public Employee(String name, int empId) {
this.empId = empId;
this.name = name;
}
答案 2 :(得分:0)
public Employee(String name, int empId) {
this.name = name; // You are missing this line
this.empId = empId;
}
public static void main(String[] args)
{
Employee e = new Employee("test",123);
System.out.println(e);
}
Employee类中的String name
在声明时隐式为null,即
String name = null;
任何引用类型变量(在本例中为String)都将被赋予默认值null。
答案 3 :(得分:0)
构造函数按如下方式执行:
null, 0, 0.0, '\u0000'
super();
= ...
的字段。您可能会发现以下谜题(印刷什么?)具有启发性。
class A {
A() {
terrible();
}
protected void terrible() {
System.out.println("A.terrible - " + this);
}
}
class C extends A {
C() {
System.out.println("C.terrible - " + this);
}
String a;
String b = null;
String c = "c";
@Override
protected void terrible() {
System.out.println("C.terrible - " + this);
a = "aa";
b = "bb";
c = "cc";
System.out.println("C.terrible (2) - " + this);
}
@Override
public String toString() {
return String.format("a=%s, b=%s, c=%s", a, b, c);
}
}
答案 4 :(得分:0)
public Employee(String name, int empId) {
this.empId = empId;
}
public Employee() {
System.out.println("Calling User Defined Constructor");
}
根据您的实例,构造函数将在运行时加载。
Construtor在初始化对象本身时设置值。
所以在你的情况下,只创建了一个实例..它传递了两个值。但只分配一个值。所以name默认设置为null .....