让我们看一小段java代码
class Foo {
int i = 0;
int j;
public Foo(int j){
this.j = j;
}
}
上面的例子展示了两种在Java中初始化变量的方法。但我的问题是哪个变量首先被初始化?构造函数外部的变量或构造函数内部的变量?
当我实例化上面的类Foo foo = new Foo(5)
时,我知道类的构造函数被调用,这意味着变量j
首先被初始化。任何人都可以让我明确订购。
答案 0 :(得分:3)
在您的情况下,int j
首先发生,默认为0
,然后在调用构造函数创建新实例时重新分配给5
。
j
仅在构造函数运行时重新分配。当您在构造函数之外分配它们时,实例成员首先被初始化。
每行代码按其出现的顺序执行。声明始终在构造函数之前按照它们在代码中列出的顺序发生。
您应该只在单个构造函数内的单个位置初始化实例成员。
依赖于默认值会导致难以追踪错误,并使测试成为一场噩梦,但未分配的实例成员会像对IDE,编译器和运行时的大拇指一样突出。不幸的是,对于像int
这样的原语,它们默认为0
,这可能不是您想要/需要的。
更好的设计是:
private final int j;
public Foo(final int j) { this.j = j; }
这使得j
无法在初始化时分配任何内容,您永远不必担心它会发生变化。
答案 1 :(得分:2)
假设你有这个课程
public class Test
{
int i = 4;
public Test()
{
System.out.println(i);
}
}
创建Test
的实例时,输出将为4
。这意味着首先进行初始化。然后调用构造函数。因为如果构造函数是第一个并且初始化i
秒,则不会将4
作为输出。
答案 2 :(得分:0)
int i = 0;
我是一个实例变量,因此会得到默认值0.因此,您不需要明确地为其指定0。
来到你的问题
But my question is which variable first get initialized?
然后答案是我在j之前初始化。因为如果您看到首先创建了代码段对象的字节代码,它将初始化您的实例变量,然后调用构造函数。
答案 3 :(得分:0)
当你创建对象创建时,首先要做变量声明。之后只定义变量。在你的情况下,第一个“j”变量将首先声明为类变量。之后,该值将在类的构造函数中指定为“j”。
答案 4 :(得分:0)
订购: -
对于您的问题,我认为i
和j
将会被初始化
i=0
;并且j
为0(默认值为int
。)
因为在构造函数中,您只是更改了值。