0

我在 Bruce Eckel 的 Thinking In Java 4th Edition 的第 128 页有一个问题,第二段,它问的最后一句话:

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

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

4

4 回答 4

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 
   }
于 2012-10-06T12:20:35.843 回答
0

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

于 2012-10-06T12:20:38.150 回答
0

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

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

-现在如果重载的构造函数没有初始化它,它的值将是null.

于 2012-10-06T12:21:39.527 回答
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是用第一个构造函数创建的,它设置w31. secondObject是使用需要boolean参数的重载构造函数创建的。这个构造函数没有设置 w3,也没有默认的初始化w3。因此,它永远不会被设置。在 Java 中,对于没有默认初始化的变量,您可以获得以下值:

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