-2
class test
{
    public static myclass x;

    test() {
       try {
           x=new myclass();
           //x is not null here
       } catch(Exception e) {/*stuff*/}
       //not null here
    }

    //x is null here in any other member method
}

请解释这种行为的原因?一旦构造函数块结束,构造函数是否不需要保留值而不是丢失它?

4

2 回答 2

4

您似乎将静态值与实例值混淆了。

x是静态的,但它没有在静态初始化块中初始化。它仅在您创建一个实例test时才被初始化(通过该实例的构造函数)。另请注意,每当您创建 的新实例时,它都会重新初始化test,这可能会给您带来一些非常奇怪的错误。

为了x将其初始化为类的静态值,请将其添加到静态初始化块中:

class test
{
    public static myclass x;

    static
    {
        x=new myclass();
    }
}

这种方式x应该只在运行时加载类时静态初始化一次。这将允许在无需首先创建 的实例的情况下对其进行访问test,并消除在 . 的任何新实例上重新初始化它的错误test

相反,如果 this 应该是实例值而不是静态值,则可以简单地更改其声明:

public myclass x;
于 2013-07-27T19:13:52.400 回答
1

因为这样的代码是正确的。但由于变量xstatic,您可能会在调用构造函数之前访问它。在这种情况下,它将为空。只要构造函数第一次运行,x 的值就会被设置为一个新对象。

如果您要求保持 x 静态。在静态初始化块中初始化它。喜欢:

class test
{
public static myclass x;
static {
    x = new myclass();
    }
}

或者简单地说:

class test
{
public static myclass x = new myclass();
}
于 2013-07-27T19:03:40.600 回答