请参阅两种类定义方法:
//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 :(得分: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。)
您询问构造函数的用途 - 您无法在初始化程序中执行所有操作。如果你需要循环或什么怎么办?