加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java中私有字段的默认初始化

发布时间:2020-12-15 05:14:47 所属栏目:Java 来源:网络整理
导读:假设我有一个名为Person的类: class Person{ private int num = 1;} 当为Person类调用空构造函数时,Java会先将num初始化为默认值零,然后将num赋值为1吗?或者Java会立即将num初始化为1吗?除非使用初始化语法,否则C不会执行前者吗? 谢谢! 解决方法 它将首
假设我有一个名为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中描述:

Each class variable,instance variable,or array component is initialized with a?default value?when it is created?

Sec 15.9.4(重点补充,部分省略):

The new object contains new instances of all the fields declared in the specified class type and all its superclasses. As each new field instance is created,it is initialized to its default value (§4.12.5).

Next,the selected constructor of the specified class type is invoked

换句话说,对象创建和构造函数调用是不同的操作,并且在调用构造函数之前将字段初始化为其默认值.

实际的字段初始化发生在构造函数中:字段初始化被内联到调用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);

换句话说,它根本不读取该字段.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读