2009-04-22 45 views
0

见类定义的方法有两种:何时加载类变量?

//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中的行为是否相同,或者它们的行为有所不同?

欢迎对上述任何澄清意见。

+0

这ISN实际上不是语言不可知的,因为它可能取决于语言,甚至取决于语言的特定实现。 – Avi 2009-04-22 14:00:29

回答

1

这取决于语言,但大多数语言在调用构造函数之前初始化字段。一般而言,我主张在上下文中进行处理,初始化通常只在声明字段的地方使用。然而,正如约翰指出的那样,有时候你需要做一些没有道理的事情/是可能的。

此外,与往常一样,如果您的字段依赖其他字段进行初始化,则顺序非常重要。在有些语言,如动作脚本,这意味着该声明的顺序确定初始化顺序:

作品:

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]; 
} 
0

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

在实例化过程中初始化类变量,然后立即运行构造函数。

0

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

你当然可以用显式的构造函数代码初始化它们(尽管如果你想将它们设置为其他东西,将自己的设置保存为null)。

你问什么是构造函数 - 你不能在初始化器中做所有事情。如果你需要循环或什么?

+0

感谢John对于构造函数的回复和好意。 – pankajt 2009-04-22 20:08:12