在下面的代码中,数据字段的初始化顺序是什么? java为数据成员和成员函数遵循的一般规则是什么?
public class TestClass
{
int j=10;
static int h=5;
public static void main(String[] args)
{
TestClass obj= new TestClass();
}
}
答案 0 :(得分:3)
一般来说:
1)静态字段成员(一般是静态初始化程序)
2)非静态字段成员
3)构造函数
但是,您可以使用以下代码片段对其进行测试:
public class TestClass {
int i = 10;
static int j = 20;
public TestClass() {
// TODO Auto-generated constructor stub
System.out.println(i);
i = 20;
System.out.println(i);
}
public static void main(String[] args) {
new TestClass();
}
}
引用伟大的“Thinking in Java”:
在一个类中,初始化的顺序由变量的顺序决定 在课堂上定义。变量定义可以分散在方法定义的整个和之间,但变量在任何方法之前都被初始化 叫 - 甚至是构造函数。 ................................... 无论创建了多少对象,静态只有一个存储空间。 您不能将statickeyword应用于局部变量,因此它仅适用于字段。如果一个字段是 staticprimitive并且您不初始化它,它获取其类型的标准初始值。如果它是 对对象的引用,默认初始化值为null。
总结创建对象的过程,请考虑一个名为Dog的类:
即使它没有明确使用static关键字,构造函数实际上也是一个 静态方法。所以第一次创建一个Dog类型的对象,或者第一次创建一个 访问类Dog的静态方法或静态字段,Java解释器必须 找到Dog.class,通过类路径搜索它。
正在加载Dog.class(创建一个Class对象,稍后您将学习),所有 它的静态初始化程序运行。因此,静态初始化仅发生一次,如同 第一次加载类对象。
当你创建一个新的Dog()时,首先是Dog对象的构造过程 为堆上的Dog对象分配足够的存储空间。
此存储被擦除为零,自动设置该Dog中的所有基元 对象为默认值(数字为零,布尔值为 char)和null的引用。
执行在字段定义点发生的任何初始化。
构造函数被执行。这实际上可能涉及相当多的活动,尤其是涉及继承时。
答案 1 :(得分:1)
这是订单。
答案 2 :(得分:0)
我认为你只是缺少JLS的section 12.4.2,其中包括:
接下来,按文本顺序执行类的类变量初始值设定项和静态初始值设定项,或接口的字段初始值设定项,就像它们是单个块一样。
“文本顺序”部分是重要的一点。
如果将m从静态变量更改为实例变量,则该字段将不会通过类初始化进行初始化 - 它只能通过实例初始化(即构造实例时)进行初始化。目前,这会导致堆栈溢出 - 创建一个实例需要创建另一个实例,这需要创建另一个实例,等等。
所以最后这是您要搜索的订单:
初始化块按它们在程序中出现的顺序运行。 首次将类加载到JVM时,将运行静态初始化块 只要创建了一个新的类实例,就会运行实例初始化块。