java中数据字段初始化的类顺序
在下面的代码中,数据字段的初始化顺序是什么?java对数据成员和成员函数遵循的一般规则是什么
public class TestClass
{
int j=10;
static int h=5;
public static void main(String[] args)
{
TestClass obj= new TestClass();
}
}
你可以在下面搜索框中键入要查询的问题!
在下面的代码中,数据字段的初始化顺序是什么?java对数据成员和成员函数遵循的一般规则是什么
public class TestClass
{
int j=10;
static int h=5;
public static void main(String[] args)
{
TestClass obj= new TestClass();
}
}
# 1 楼答案
一般而言:
1)静态字段成员(通常为静态初始值设定项)
2)非静态字段成员
3)建造商
但是,您可以使用以下代码片段对其进行测试:
引用伟大的“Java思维”一文:
总结创建对象的过程,考虑一个名为Boo:的类。
尽管它没有显式使用static关键字,但构造函数实际上是一个 静态方法。所以第一次创建Dog类型的对象,或者第一次创建 访问类Dog的静态方法或静态字段时,Java解释器必须 找到狗。类,它通过在类路径中搜索来执行此操作
像狗一样。类被加载(创建一个类对象,稍后您将了解它),所有 它的静态初始值设定项正在运行。因此,静态初始化只发生一次,因为 类对象是第一次加载的
创建新的Dog()时,首先要执行Dog对象的构造过程 为堆上的Dog对象分配足够的存储空间
该存储被擦除为零,自动设置该狗中的所有原语 对象的默认值(数字为零,布尔和 char)和对null的引用
执行在字段定义点发生的任何初始化
构造函数被执行。这实际上可能涉及相当多的活动,特别是在涉及继承的情况下
# 2 楼答案
这是订单
# 3 楼答案
我认为您只是缺少了section 12.4.2个JLS,其中包括:
接下来,按照文本顺序执行类的类变量初始值设定项和静态初始值设定项,或者执行接口的字段初始值设定项,就像它们是单个块一样
“按文本顺序”部分是重要的一点
如果将m从静态变量更改为实例变量,则该字段将不会通过类初始化进行初始化-它将仅通过实例初始化进行初始化(即,在构造实例时)。目前,这将导致堆栈溢出-创建一个实例需要创建另一个实例,这需要创建另一个实例,等等
最后,这里是您要搜索的顺序:
初始化块按它们在程序中出现的顺序运行。 静态初始化块在类首次加载到JVM时运行 每当创建类的新实例时,实例初始化块就会运行