Java中什么是变量阴影

时间:2019-04-29 03:17:57  来源:igfitidea点击:

当定义的方法的输入参数的名称与静态变量或实例变量的名称相同时,会出现阴影(Shadowing)。

请看下面示例

class Auto {

  int maxSpeed;

  float weight;

  //带参数的构造函数

  public Auto(int maxSpeed, float Weight) {

      //阴影

      //给自身赋值 警告

      maxSpeed = maxSpeed;

      weight = Weight;

  }

  public void setMaxSpeed(int maxSpeed) {

      //阴影

      //给自身赋值 警告

      maxSpeed = maxSpeed;

  }

  public int getMaxSpeed() {

      return this.maxSpeed;

  }

}

public class Main {

  public static void main(String[] args) {

      Auto a = new Auto(180, 2000);

      System.out.println(a.getMaxSpeed());

      a.setMaxSpeed(200);

      System.out.println(a.getMaxSpeed());

  }

}

然后我们将看到Auto()方法(构造函数)和setMaxSpeed()有一个输入参数maxSpeed,其名称与实例变量相等。

运行该示例,结果是:

0

0

因为输入参数正在两个方法中隐藏实例变量。基于代码逻辑,我们希望用参数值初始化实例变量,但是在编译方法时,左maxSpeed变量被视为局部变量,而不是实例变量。编译器甚至会用 [Assignment to self] 警告消息警告我们可能有错误。

在这种情况下,需要使用 this引用来指示哪个变量是实例变量非常重要。所以正确的例子是:

class Auto {

	int maxSpeed;

	float weight;

	// 带参数的构造函数

	public Auto(int maxSpeed, float Weight) {

		// 使用this显示实例变量

		this.maxSpeed = maxSpeed;

		weight = Weight;

	}

	public void setMaxSpeed(int maxSpeed) {

		// 使用this来引用实例变量

		this.maxSpeed = maxSpeed;

	}

	public int getMaxSpeed() {

      return this.maxSpeed;

  }

}

对于静态变量,不能使用 this来避免阴影(Shadowing),因为静态变量是类变量而不是实例变量。

在本例中,需要使用类名,如下所示:

class Auto {

	static int category;

	int maxSpeed;

	float weight;

	public static void setCategory(int category)

  {

	// 使用类名来显示类变量

      Auto.category = category;

  }

}