在java中的构造函数中初始化类变量

时间:2014-08-29 11:46:20

标签: java constructor instance-variables

我们知道......

实例变量在默认构造函数中初始化。例如。

public class H{
    int x;

    public static void main(String... args){
        System.out.print(new H().x);
    }
}

上面代码的O / P是 0 ,因为有一个默认的构造函数被调用,并且该构造函数将x初始化为0。

现在,我的问题是,如果我们运行以下代码,即

public class H{
        int x;

        public H(){}

        public static void main(String... args){
            System.out.print(new H().x);
        }
}

在这种情况下,实际的O / P也是 0 ,但我认为应该有编译器错误,x未初始化,因为我们已经覆盖默认构造函数而没有初始化xI think我的问题很清楚......

5 个答案:

答案 0 :(得分:8)

默认情况下,在java中初始化非final字段。默认情况下,仅初始化方法和最终字段中的变量。

如果你声明x是最终的,那么你就是对的。您将在代码中遇到编译错误。

答案 1 :(得分:7)

在Java中,实例成员默认默认为其值的所有位数版本(int0,对象引用为nullfloats0.0,布尔是false,依此类推)。它不是默认构造函数所做的,它是在构造函数运行之前完成的

订单是:

  1. 将实例成员默认为其all-bits-off值。 (优化器可以跳过这个,如果它看到#2或可能,如果它可以向自己证明在每个#3初始化之前没有使用该成员。) < / p>

  2. 应用它们的任何内联初始化。例如:

    int a = 42;
    
  3. 以源代码顺序应用实例初始化块。

  4. 调用相应的构造函数。

  5. 例如:

    class Example {
    
        int a = 42;
    
        // Instance initializer block:
        {
            this.a = 67;
        }
    
        Example() {
            System.out.println(this.a);
        }
    }
    

    new Example()输出67

    显然,在这两个地方进行初始化都是不好的做法,这仅仅是为了说明。

答案 2 :(得分:3)

所有实例级变量都初始化为其默认值,而不管构造函数是否已经过载(或者添加了显式的无参数构造函数)。构造函数只是更改默认值。

答案 3 :(得分:2)

实例变量具有与之关联的默认值

来自The Java™ Tutorials

  

默认值

     

声明字段时并不总是需要指定值。声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值为零或null,具体取决于数据类型。

答案 4 :(得分:1)

Java对于程序员来说非常简洁(不像其他人,例如C),这意味着它会自动初始化字段。一个例外是方法中的最终字段和字段(然后编译器将产生错误)。

希望它有所帮助。