繁体   English   中英

两个类成员声明和初始化之间的区别

[英]Difference between two class member declaration and initialization

以下几种类成员声明和初始化之间的确切区别是什么?

选项1:

public class MyClass {
    private int myInt = 1;
}

选项2:

public class MyClass {
    private int myInt;
    {
        myInt = 1;
    }
}

如果是

public class MyClass {
    private int myInt;
    {
        myInt = 1;
    }
}

每次构造对象实例初始化块都会在构造函数之前运行。

在第二种情况下,它是相同的:)

结论:没什么区别(但是值得知道当构造一个对象时会发生什么)。

请参阅文档-初始化实例成员

Java编译器将初始化程序块复制到每个构造函数中。 因此,该方法可用于在多个构造函数之间共享代码块。

请注意,您可以使用javap -c反编译文件并进行验证。

区别是句法上的。 在大多数情况下,第一种形式更易于阅读和直接使用。 第二种形式可能会更强大,因为它分隔了声明和初始化,但是给出了这个确切的示例,编译器将生成完全相同的字节码。 这是因为编译器会将字段初始化程序和init块放入每个构造函数中。 在更复杂的情况下,您会发现两种方法之间的顺序可能会有所不同。 这是一个最好避免的细微区域,因为它可能导致意外的NullPointerExceptions。

为了使自己信服,可以使用javap -c反编译生成的类文件。

对于第一个版本,我们得到

public class A {
  public A();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: aload_0       
       5: iconst_1      
       6: putfield      #2                  // Field myInt:I
       9: return        
}

对于第二个版本,我们得到

public class B {
  public B();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: aload_0       
       5: iconst_1      
       6: putfield      #2                  // Field myInt:I
       9: return        
}

在第一种情况下,您要声明并初始化成员myInt 。在第二种情况下,您将在两个语句中执行任务。 在这种情况下,添加大括号实际上并没有任何区别。

赋值 :丢弃变量的旧值,然后用新值替换。 喜欢 :

myInt = 8;

初始化 :这是一种特殊的分配:第一种。 在初始化之前,对象具有null值,原始类型具有默认值,例如0或false。( 可以与声明一起完成,就像在第一种情况下一样):

private int myInt = 1; //both together

声明 :声明声明变量的类型及其名称。 一个变量只能声明一次。 编译器使用它来帮助程序员避免错误,例如将字符串值分配给整数变量。 在读取或分配变量之前,必须先声明该变量。 喜欢 :

private int myint;

希望有帮助:)

如果将变量声明为final ,那将有所作为。 如果final变量在声明时立即分配了编译时常量,则该变量也将是编译时常量。 这意味着,无论何时访问变量,它的值都将在编译时复制,而不是在运行时读取,并且它的值可能出现在仅允许编译时常量的位置:

仅用于说明:

public class MyClass {
  private final int myInt = 1;
  private final int myIntPlusOne = myInt + 1;// adding two constants

  public MyClass(int parameter) {
    switch(parameter)
    {
      case myInt: // using a name for 1
      case myIntPlusOne: // and for 2
    }
  }
}

如果将final int myInt = 1更改为final int myInt; { myInt = 1; } final int myInt; { myInt = 1; } final int myInt; { myInt = 1; }

确切的规范可在Java语言规范§4.12.4中找到。 最终变量

常量变量是使用常量表达式(第15.28节 )初始化的原始类型或String类型的最终变量。

对于非final变量,没有区别。

没有任何尊重,但是它可以使您的代码更整洁。 请记住,

{

}

与int无关!

暂无
暂无

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

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