Java中私有字段的默认初始化
假设我有一个名为Person的类:
class Person{ private int num = 1; } 当为Person类调用空构造函数时,Java会先将num初始化为默认值零,然后将num赋值为1吗?或者Java会立即将num初始化为1吗?除非使用初始化语法,否则C不会执行前者吗? 谢谢! 解决方法
它将首先赋值为零.
如果你在字段声明之前放了一些东西,你可以看到: class Person{ { print(); } private int num = 1; { print(); } void print() { System.out.println(num); } } 这将打印: 0 1 这在JLS Sec 4.12.5中描述:
Sec 15.9.4(重点补充,部分省略):
换句话说,对象创建和构造函数调用是不同的操作,并且在调用构造函数之前将字段初始化为其默认值. 实际的字段初始化发生在构造函数中:字段初始化被内联到调用super(…)之后立即调用super(…)的每个构造函数.以下完全等同于上述内容: class Person{ private int num; Person() { super(); print(); num = 1; print(); } void print() { System.out.println(num); } } 一个微妙的观点,尽管声明字段final会产生这段代码的输出: 1 1 这并不意味着最终变量会更早初始化.在这种情况下所有改变的是num已经成为编译时常量表达式,因此被内联.因此,print()实际上将执行: System.out.println(1); 换句话说,它根本不读取该字段. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |