什么时候加载类变量?

时间:2009-04-22 12:24:00

标签: language-agnostic class

请参阅两种类定义方法:

//definition: 1
public class MyClass{

    private MyObject obj = new MyObject();
    private String   str = "hello world";

    // constructor
    public MyClass(){

    }
}

// definition: 2
public class MyClass{

    private MyObject obj = null;
    private String   str = null;

    // constructor
    public MyClass(){
        obj = new MyClass();
        str = "HelloWorld";
    }    
}

我的问题是:何时加载了类变量。它们是如何装载的?

他们的初始化是如何发生的?如果它们的初始化可能发生在定义1中,那么构造函数的目的是什么?

哪个是定义类的首选方法,为什么? C ++ / C#/ Java中的行为是否相同,或者这种行为在它们之间有所不同?

欢迎任何有关上述内容的澄清评论。

3 个答案:

答案 0 :(得分:1)

这取决于语言,但大多数语言在调用构造函数之前初始化字段。一般来说,我提倡在上下文中做事,初始化通常只与声明字段的地方相关。然而,正如约翰指出的那样,有时候你需要做一些没有意义/可能在一行中的事情。

此外,与往常一样,如果您的字段依赖于其他字段进行初始化,则顺序很重要。在某些语言中,如ActionScript,这意味着声明的顺序决定了初始化的顺序:

<强>使用:

public class Foo
{
    private var bar:Array = [1, 2, 3];
    private var baz:Array = bar.concat([4, 5, 6]);
}

不起作用:

public class Foo
{
    private var baz:Array = bar.concat([4, 5, 6]);
    private var bar:Array = [1, 2, 3];
}

答案 1 :(得分:0)

构造函数是将类实例化为对象时运行的第一个函数。

在实例化期间初始化类变量,然后在此之后立即运行构造函数。

答案 2 :(得分:0)

在大多数语言中,实例字段(它们在我所知的任何语言中都不称为类变量)将在实例构建期间初始化。它们实际上是构造函数的一部分,在实际的构造函数代码之前执行。

您当然可以在显式构造函数代码中初始化它们(但如果要将它们设置为其他内容,请将设置保存为null。)

您询问构造函数的用途 - 您无法在初始化程序中执行所有操作。如果你需要循环或什么怎么办?