如果Java中存在用户定义的构造函数,则初始化变量

时间:2014-12-09 09:27:28

标签: java constructor

在下面的代码中,我有一个用户定义的构造函数(没有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);
    }

}

5 个答案:

答案 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。

Variable initialization and default values

答案 3 :(得分:0)

构造函数按如下方式执行:

  • 所有字段均为"归零&#34 ;; 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 .....