1

如果第一个构造函数没有,有人可以解释输出 0this吗?

如果参数变量名称与类属性名称相同,并且我在方法中使用该属性。java如何解释“类属性”或“参数变量”?

没有this

 public User(int userId){
    userId = userId;

 }

this

 public User(int userId){
    this.userId = userId;

 }


 public void PrintUserId(){
    System.out.println(this.userId);
}

 User firstUser = new User(123);
 firstUser.PrintUserId(); 

// 0 没有这个

//123 用这个

4

2 回答 2

6

如果第一个构造函数没有这个,有人可以解释输出 0 吗?

当然 - 这个声明是一个无操作:

userId = userId;

它只是将userId参数的变量分配给自身。它根本不涉及领域。在该方法中,参数userId 隐藏了所调用的字段userId- 因此您必须明确表示您要引用该字段,这是第二个版本所做的:

this.userId = userId;

我希望任何现代 IDE 都会在第一个版本中突出显示无操作分配并发出警告。

(顺便说一下,术语值得清楚 -参数是提供给方法的值;参数是声明为方法签名的一部分的变量。同样,它是字段而不是属性。)

编辑:如果参数有不同的名称,例如

public User(int id) {
    userId = id;
}

那么参数不会隐藏该字段,并且标识符userId仍然引用该字段。只需弄清楚标识符的含义是什么-在您的第一个示例中,简单名称userId是指参数,这就是导致问题的原因。

编辑:来自JLS 的第 6.4.1 节

某些声明可能在其范围的一部分被另一个同名声明所遮蔽,在这种情况下,不能使用简单名称来引用声明的实体。

...

一个名为 n 的字段或形式参数的声明 d 在 d 的整个范围内隐藏了在 d 出现点的范围内的任何其他名为 n 的变量的声明。

所以在这种情况下 d 将是形参的声明userId,而 d 的范围是构造函数——所以通过构造函数,参数会隐藏字段。

于 2012-04-15T18:59:30.343 回答
4

这是因为阴影

您没有将参数值分配给userId成员变量,因为它被隐藏了。因为int成员变量被初始化为 0 这就是为什么你看到没有this关键字的输出。

于 2012-04-15T19:01:37.347 回答