java何时执行类级字段分配? 我认为自己在编程方面有点初级/中级;大多数时候,我似乎知道如何编写代码,但我不知道java用它做什么。有时我会在构造函数中指定一个字段: public class MyClass { public int x; MyClass() { x = 5; } }
…据我所知,在创建MyClass的新对象时,x被设置为5。但是,有时我会在任何构造函数或函数之外分配字段:java何时执行类级字段分配? 我认为自己在编程方面有点初级/中级;大多数时候,我似乎知道如何编写代码,但我不知道java用它做什么。有时我会在构造函数中指定一个字段: public class MyClass { public int x; MyClass() { x = 5; } },java,class,field,Java,Class,Field,…据我所知,在创建MyClass的新对象时,x被设置为5。但是,有时我会在任何构造函数或函数之外分配字段: public class MyClass { public int x = 5; public static MyOtherClass y = new MyOtherClass(); public MyClass() { } } java什么时候运行这些分配?它们是在创建MyClass的对象时完成的,还是在此之前完成的?如果我引用静态变量,如
public class MyClass {
public int x = 5;
public static MyOtherClass y = new MyOtherClass();
public MyClass() {
}
}
java什么时候运行这些分配?它们是在创建MyClass的对象时完成的,还是在此之前完成的?如果我引用静态变量,如“y”:
是在我第一次引用时分配了“y”,还是Java在此之前已经完成了?在这种情况下,在创建MyClass的新对象后不能指定“y”,因为我还没有为它创建任何对象。那么,在程序运行时,构造函数和方法之外的所有字段分配是一次性完成的,还是在第一次引用/需要它们时分配的?还是改天?感谢您提供有关此信息。成员变量初始值设定项如下:
public class MyClass {
public int x = 5;
public int y;
MyClass() {
y = 6;
}
}
内联到调用超级构造函数(隐式或显式)的所有构造函数中,在调用超级构造函数和构造函数体的其余部分之间:
public class MyClass {
public int x;
MyClass() {
super();
x = 5;
y = 6;
}
}
不仅仅是成员变量初始值设定项:成员变量初始值设定项基本上类似于成员声明,后跟实例初始值设定项:
public int x = 5;
// is the same as
public int x;
{
x = 5;
}
类中的所有实例初始值设定项都按照在类中声明的顺序内联到超级调用构造函数中。成员变量初始值设定项如下:
public class MyClass {
public int x = 5;
public int y;
MyClass() {
y = 6;
}
}
内联到调用超级构造函数(隐式或显式)的所有构造函数中,在调用超级构造函数和构造函数体的其余部分之间:
public class MyClass {
public int x;
MyClass() {
super();
x = 5;
y = 6;
}
}
不仅仅是成员变量初始值设定项:成员变量初始值设定项基本上类似于成员声明,后跟实例初始值设定项:
public int x = 5;
// is the same as
public int x;
{
x = 5;
}
类中的所有实例初始值设定项都按照在类中声明的顺序内联到超级调用构造函数中。它们被视为初始化块的一部分(不带“name”的
{..}
)。例如intval1=1;int val2;{val2=2;}int val3=3代码>可被视为int val1;int val2;int val3;{val1=1;val2=2;val3=3}
。初始化块在每个构造函数的开头复制(在其super(..)
调用之后,隐式或显式)。所以如果你有intval=42在构造函数中,您将编写MyClass(){val=10;}
,然后它将被编译,就像编写MyClass(){super();{val=42;}val=10;}
一样。因此,构造函数中的值将覆盖字段中直接设置的值。它们被视为初始化块的一部分(不带“name”的{..}
)。例如intval1=1;int val2;{val2=2;}int val3=3代码>可被视为int val1;int val2;int val3;{val1=1;val2=2;val3=3}
。初始化块在每个构造函数的开头复制(在其super(..)
调用之后,隐式或显式)。所以如果你有intval=42在构造函数中,您将编写MyClass(){val=10;}
,然后它将被编译,就像编写MyClass(){super();{val=42;}val=10;}
一样。所以构造函数中的值将覆盖字段中直接设置的值。明白了,谢谢。如果它们是静态的,并且从来没有调用构造函数呢?明白了,谢谢。如果它们是静态的,并且从来没有调用构造函数,那该怎么办?