public class Arpan
{
String arpan;
public void arpan()
{
String arpan;
arpan = "myname";
}
public void sen()
{
arpan = "myname";
}
}
为什么在执行arpan函数期间没有问题,即使String变量与arpan同名。
请解释在执行程序期间如何创建变量。
答案 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} }