在这两种情况下,用于访问字段的字节码完全相同。对于第一个,javap -c
返回:
public MyClass(java.lang.String, int);
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: aload_1
6: putfield #2; //Field name:Ljava/lang/String;
9: aload_0
10: iload_2
11: putfield #3; //Field age:I
14: return
}
第二个:
public MyClass(java.lang.String, int);
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: aload_1
6: putfield #2; //Field name:Ljava/lang/String;
9: aload_0
10: iload_2
11: putfield #3; //Field age:I
14: return
}
如您所见,它们在功能上是等效的。重要的是能够理解代码。对于构造器和设置器,Java 社区的标准是使用名称阴影(参数与字段共享名称),然后使用this.
限定符访问字段。但是,在逻辑方法中,强烈建议您不要隐藏字段。例如,我会避免这样的事情:
public class MyClass {
// ...
public int calculateAgeDifference(MyClass other) {
int age = other.age; // This hides this.age, don't do this
return this.age - age;
}
}
相反,请执行以下操作:
int otherAge = other.age;
这使您的代码更具可读性。因此,如果您使用它,请仅在设置器和构造器中使用阴影,我强烈建议在其他任何地方避免使用它。