Java 声明局部变量后,实例变量将不可见

Java 声明局部变量后,实例变量将不可见,java,Java,当您在方法中使用与-相同的名称和类型(如实例变量)声明局部变量时,是否意味着该实例变量在该方法中变为“不可见” public class Test { Card card; public void foo(){ Card card = new Card(); card.test(); } } 所以我在foo()方法中声明并实例化局部变量card。然后对局部变量调用test()方法。如果我移除卡=新卡()test()方法。实例变量不会变为不可见,但会被局部变量隐藏。您仍然可以使用t

当您在方法中使用与-相同的名称和类型(如实例变量)声明局部变量时,是否意味着该实例变量在该方法中变为“不可见”

public class Test {
 Card card;
 public void foo(){
  Card card = new Card();
  card.test();
 }
}

所以我在foo()方法中声明并实例化局部变量card。然后对局部变量调用test()方法。如果我移除
卡=新卡()test()方法。

实例变量不会变为不可见,但会被局部变量隐藏。您仍然可以使用
this来访问它。方法中的局部作用域变量将优先于具有相同名称的实例变量,除非您使用
this
关键字将实例变量引入作用域。

您可以使用
this.card
来访问实例变量。

this.variable
引用将始终获取实例变量。如果您有一个与实例变量相同的函数参数,这可能会很有用,不过如果可以的话,我建议您尽量避免这个问题。

是的,本地范围的卡将优先。您可以使用“this”引用实例变量:

public void foo() {
  Card card = new Card();
  this.card.test(); // tests the instance variable card
  card.test(); // tests the local card
}

如果您想引用实例变量而不是本地变量,则必须使用

您看到的有时被称为“隐藏”变量。任何时候在内部范围内声明变量时,该变量都会成为与该名称绑定的默认变量,直到它超出范围

在这种情况下,您可以使用以下语法访问类变量:

this.card

这在构造函数中很常见,构造函数参数隐藏了实例成员。除此之外,您的实例成员应该有一个更具描述性或唯一性的名称,这可能是一个症状。这在setter方法中也很常见。