对特定情况的混淆,其中不同的变量具有相同的名称

时间:2014-12-17 17:37:16

标签: java scope

public class Arpan
{
  String arpan;

  public void arpan()
  {
    String arpan;
    arpan = "myname";
  }

  public void sen()
  {
    arpan = "myname";
  }
}

为什么在执行arpan函数期间没有问题,即使String变量与arpan同名。

请解释在执行程序期间如何创建变量。

4 个答案:

答案 0 :(得分:5)

这称为“阴影”。

在我们开始之前,让我们只使用arpan来解决两个问题,因为使用该名称的方法(并使用Arpan作为类名)会让人感到困惑。 :-)让我们来代替这个代码:

public class Foo
{
  String arpan;

  public void method1()
  {
    String arpan;
    arpan = "myname";
  }

  public void method2()
  {
    arpan = "myname";
  }
}

arpan中的method1变量是一个局部变量。在该方法中使用自由符号arpan将引用变量,因为变量 shadow 实例字段。

使用arpan中的免费符号method2将使用arpan中声明的Foo实例字段(它不是“变量”),因为它 isn 't 被局部变量遮蔽。

一般来说,可以这样想:编译器在当前作用域中查找符号,如果找不到,则查看包含作用域,依此类推。更多信息JLS §6.4.1: Shadowing


主观上,我总是倾向于通过在它们前面使用this.来引用实例字段和方法时明确,因此无论我是指实例字段还是变量,都没有歧义。许多工具都可以配置为 require ,即使Java语言没有。

答案 1 :(得分:2)

Java允许你这样做。如果编译器是方法名称或变量名称,编译器将从您使用标识符的上下文中获知。当您编写arpan = "myname"时,编译器知道您引用了一个变量。当您编写arpan()时,编译器知道您引用了一个方法。语法的设计方式使得两个上下文不会被误解,即没有允许“直接”调用的变量类型,并且没有可以直接分配方法名称的变量。

Java还允许局部变量“阴影”具有相同名称的类级变量。请注意,您始终可以使用this.arpan语法访问带阴影的变量。

可以这样做的事实并不意味着你应该这样做。除了一些特殊情况,这会导致代码难以理解和维护。

答案 2 :(得分:0)

方法中声明的变量仅在该方法中可用。要引用该方法中的类级变量,您需要使用this.arpan。

答案 3 :(得分:0)

没有问题,因为arpan中定义的arpan()是一个局部变量,并且它在java中完全有效,用于定义与类变量同名的局部变量,它被称为{{3} }