繁体   English   中英

构造函数初始化变量

[英]variable initialization by constructor

关于变量x3,哪个构造函数对其进行初始化? 我似乎无法弄清楚。 会是X类的无参数构造函数吗? 还是对象类的默认构造函数?

class X {
    int x1, x2, x3;
}

x3是一个实例变量,它将具有默认值0(对于int)。 从Java文档:

声明字段时,不一定总是需要分配值。 编译器会将已声明但未初始化的字段设置为合理的默认值 通常,此默认值将为零或null,具体取决于数据类型。

但是,通常认为依赖于此类默认值是不好的编程风格。

如果它是局部变量(例如在方法中创建的局部变量),则必须对其进行初始化。 所以我会说, class X的默认构造函数初始化x3 ,或者可以说,默认情况下它将初始化为0。

public class Hello {
    private int x;
    private int y = 0;
}

这将导致以下类文件:

public class Hello {

  // Field descriptor #6 I
  private int x;

  // Field descriptor #6 I
  private int y;

  // Method descriptor #9 ()V
  // Stack: 2, Locals: 1
  public Hello();
     0  aload_0 [this]
     1  invokespecial java.lang.Object() [11]
     4  aload_0 [this]
     5  iconst_0
     6  putfield Hello.y : int [13]
     9  return
}

如果我正确阅读以上内容:

  • y在隐式无参数构造函数中初始化
  • x在任何构造函数中都没有初始化
    • Java的保证了编译器将一个默认值分配0给它-但是这个初始化没有在字节码看到,所以它可能留给编译器来决定何时初始化(即你应该依赖于变量的初始化任何特定时刻-即使您通过观察确定何时发生这种情况,也无法保证将来不会更改或在不同的JVM之间不会更改。

在进入构造函数之前,将它们初始化为相关的默认值(零或null)。

参见以下类似问题(链接至JLS):

哪个先运行? 实例变量或超级构造函数的默认值?

其他任何事情似乎都可能危及Java环境的封装。 如果未初始化字段,则可能会暴露未初始化的数据,并且恶意程序可能会利用该字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM