什么是Java中的变量阴影?

在Java中,您可以声明三种类型的变量,即实例变量,静态变量和局部变量。

  • 局部变量-在方法,构造函数或块内部定义的变量称为局部变量。该变量将在方法中声明和初始化,并且在方法完成后将销毁该变量。

  • 实例变量-实例变量是类中但任何方法之外的变量。这些变量在实例化类时初始化。可以从该特定类的任何方法,构造函数或块内部访问实例变量。

  • 类(静态)变量-类变量是在类内在任何方法之外使用static关键字声明的变量。

可变阴影

如果实例变量和局部变量在您每次在方法中打印(访问)时都具有相同的名称。将打印局部变量的值(隐藏实例变量)。

示例

在以下Java示例中,类FieldShadowingExample具有两个实例变量(名称,年龄)和一个方法(display())。

在该方法中,有两个与实例变量相同的变量(名称和类型)。

当您在方法中调用打印(访问)它们时,局部变量值将在实例值的阴影下打印。

public class FieldShadowingExample{
   String name = "Krishna";
   int age = 25;
   public void display(){
      String name = "Vishnu";
      int age = 22;
      System.out.println("Name: "+name);
      System.out.println("age: "+age);
   }
   public static void main(String args[]){
      new FieldShadowingExample().display();
   }
}

输出结果

Name: Vishnu
age: 22

如果您仍然需要访问方法中实例变量的值(在这种情况下),则需要使用此关键字(或对象)访问它们,如下所示-

示例

public class FieldShadowingExample{
   String name = "Krishna";
   int age = 25;
   public void display(){
      String name = "Vishnu";
      int age = 22;
      System.out.println("Name: "+name);
      System.out.println("age: "+age);
      System.out.println("Name: "+this.name);
      System.out.println("age: "+this.age);
   }
   public static void main(String args[]){
      new FieldShadowingExample().display();
   }
}

输出结果

Name: Vishnu
age: 22
Name: Krishna
age: 25