2016-06-14 33 views
1

我有两个类。它们都在构造函数中引用相同的变量。我很困惑,当我使用this.name时,我不需要更改参数的名称,Java编译器知道我指的是主变量?构造函数参数使用这种差异?

在第二个示例中,参数名称已更改,但未使用this。 这两个类别有什么不同? 他们都认为“好编程”?

class Account { 
    private string name; 
    private int amount; 

    Account(String name, int amount) { 
     this.name = name; 
     this.amount = amount; 
    } 
    } 

class Account { 
private string name; 
private int amount; 

Account(String n, int a) { 
    name = n; 
    amount = a; 
} 
} 
+0

第二种情况下的'this'是隐含添加的 – Ramanlfc

回答

1

Java允许为实例变量和局部变量/参数使用相同的名称。

当方法/构造函数参数名称与实例变量名称相同时,我们需要明确使用this关键字来通知JVM我们正在尝试使用此实例变量;不是局部变量。否则,对于没有this的相同命名变量,JVM将选择更具体的范围变量。

对于第一种情况下,你使用的是相同的变量名称叫name参数和实例变量,所以你需要明确界定哪一个是使用this为波纹管的实例变量:

this.name = name; 

对于第二种情况,有没有命名混淆,所以如果你不使用this确定实例变量没有问题。

N.B. 当您访问实例变量时,最好使用this以提高可读性。

1

无论是罚款。如果您希望私有实例变量也被称为名称,则只能使用this.name。当你有一个与参数不同的实例变量时,它并不重要。

2

在这种情况下Account(String name, int amount)如果您的代码说name = "ABC";,它是设置参数name,而不是成员。如果你想设置成员,你需要通过this.name来引用它。

因此name = name;什么都不做(将参数设置为自身)。 this.name = name;将成员设置为参数。

2

您的两个代码都没有错。但是,在Java中,使用无意义的名称前缀或后缀来区分实例变量和局部变量的参数被认为是不好的做法。我想推荐使用任何名称使代码最容易理解。

1

这两个类别有什么不同?

功能无。编译器会改变你的第二个示例如下:

Account(String n, int a) 
{ 
    this.name = n; 
    this.amount = a; 
} 

是左右逢源考虑“良好的编程”?

我更喜欢第一种写代码的方式。