在java构造函数初始化中思考

时间:2012-10-06 12:11:48

标签: java

我在第128页的Bruce Eckel的Thinking In Java第4版中提出了一个问题,第二段,它问的最后一句:

  

如果定义的重载构造函数未初始化w3并且其定义中没有w3的“默认”初始化,会发生什么?

我发现这句话让人难以理解,本书的专家或读者可以帮我一点吗?谢谢!

4 个答案:

答案 0 :(得分:1)

Window w3 = new Window(3);

如果有人没有在重载的构造函数中正确初始化w3,那么这只是一种保护。这样的字段实例化自动放在每个构造函数的开头。因此,即使是重载的也会收到w3初始化。

如果您仅声明Window w3,则执行重载的构造函数时w3将保持null

以下是本书的代码:

import static net.mindview.util.Print.*;
    // When the constructor is called to create a
    // Window object, you’ll see a message:
    class Window {
        Window(int marker) 
        { 
            print("Window(" + marker + ")"); 
        } 
    }

   class House { 
       Window w1 = new Window(1); 
       // Before constructor 
       House() {
           // Show that we’re in the constructor:
           print("House()");
           w3 = new Window(33); // Reinitialize w3
       }
        Window w2 = new Window(2); 
        // After constructor void f() { print("f()"); } 
        Window w3 = new Window(3); 
    // At end 
   }

答案 1 :(得分:0)

Java中的每个字段类型都有一个预定义的默认值,分别为null,零或false,适用于相关类型。另一方面,如果某个字段为final,则没有默认值,并且编译错误是不在构造时提供一个。

答案 2 :(得分:0)

- w3如果是一个字段(即Instance variable

- 默认情况下,它将初始化为null,作为对象引用变量的默认值为空。

- 现在,如果重载的构造函数未初始化,则其值为null

答案 3 :(得分:0)

我没有这本书,也没有读过它。因此,这只是猜测:

w3是类

的成员变量
class A {
  public int w3; // w3 has no default initialization

  public B() {
    w3 = 1; // w3 is initialized here
  }

  public B(boolean x) {
    // w3 is not initialized here
  }  
}

您可以这样做:

A firstObject = new A();
System.out.println("firstObject.w3 is " + firstObject.w3);
A secondObject = new A(false);
System.out.println("secondObject.w3 is " + secondObject.w3);

您的输出将是

firstObject.w3 is 1
secondObject.w3 is 0

说明:firstObject是使用第一个构造函数创建的,该构造函数将w3设置为1secondObject是使用需要boolean参数的重载构造函数创建的。此构造函数不设置w3,也没有w3的默认初始化。因此,它永远不会被设定。在Java中,您可以获得以下没有默认初始化的变量值:

  • int/short/byte0
  • long0L
  • double0.0d
  • float0.0f
  • char\u0000
  • booleanfalse
  • Object(以及所有派生类):null
  • final字段:如果没有默认初始化,它们没有默认值并抛出编译器错误