Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对不同变量具有相同名称的特定情况的混淆_Java_Scope - Fatal编程技术网

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

Java 对不同变量具有相同名称的特定情况的混淆,java,scope,Java,Scope,为什么即使字符串变量与arpan同名,在执行函数arpan的过程中也没有问题 请解释在程序执行期间如何创建变量。方法中声明的变量仅在该方法中可用。要在该方法中引用类级变量,需要使用此.arpan。方法中声明的变量仅在该方法中可用。要在该方法中引用类级别变量,需要使用此.arpan。这称为“阴影” 不过,在开始之前,让我们先用arpan来表示这两个问题,因为使用该名称的方法(并使用arpan作为类名)会让人困惑。:-)让我们参考以下代码: public class Arpan { String

为什么即使字符串变量与arpan同名,在执行函数arpan的过程中也没有问题


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

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

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

这称为“阴影”

不过,在开始之前,让我们先用
arpan
来表示这两个问题,因为使用该名称的方法(并使用
arpan
作为类名)会让人困惑。:-)让我们参考以下代码:

public class Arpan
{
  String arpan;

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

  public void sen()
  {
    arpan = "myname";
  }
}
method1
中的
arpan
变量是一个局部变量。在该方法中使用自由符号
arpan
将引用变量,因为变量会遮挡实例字段

使用
method2
内部的自由符号
arpan
将使用
Foo
中声明的
arpan
实例字段(它不是“变量”),因为它不受局部变量的影响

通常,可以这样想:编译器在当前作用域中查找符号,如果找不到,则查找包含的作用域,依此类推。更多


主观上,在引用实例字段和方法时,我总是倾向于使用前面的
this.
来显式地引用它们,这样无论我引用的是实例字段还是变量,都不会有歧义。许多工具可以配置为需要,即使Java语言不需要。

这称为“阴影”

不过,在开始之前,让我们先用
arpan
来表示这两个问题,因为使用该名称的方法(并使用
arpan
作为类名)会让人困惑。:-)让我们参考以下代码:

public class Arpan
{
  String arpan;

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

  public void sen()
  {
    arpan = "myname";
  }
}
method1
中的
arpan
变量是一个局部变量。在该方法中使用自由符号
arpan
将引用变量,因为变量会遮挡实例字段

使用
method2
内部的自由符号
arpan
将使用
Foo
中声明的
arpan
实例字段(它不是“变量”),因为它不受局部变量的影响

通常,可以这样想:编译器在当前作用域中查找符号,如果找不到,则查找包含的作用域,依此类推。更多



主观上,在引用实例字段和方法时,我总是倾向于使用前面的
this.
来显式地引用它们,这样无论我引用的是实例字段还是变量,都不会有歧义。许多工具可以配置为需要,即使Java语言不需要。

Java允许您这样做。编译器从使用标识符的上下文中知道它是方法名还是变量名。当您编写
arpan=“myname”
时,编译器知道您引用了一个变量。当您编写
arpan()
时,编译器知道您引用了一个方法。语法的设计方式确保这两种上下文不会出错,即没有允许“直接”调用的变量类型,也没有可以直接为其分配方法名的变量

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


你能做到这一点并不意味着你应该做到这一点。除了一些特殊情况外,这会导致代码更难理解和维护。

Java允许您这样做。编译器从使用标识符的上下文中知道它是方法名还是变量名。当您编写
arpan=“myname”
时,编译器知道您引用了一个变量。当您编写
arpan()
时,编译器知道您引用了一个方法。语法的设计方式确保这两种上下文不会出错,即没有允许“直接”调用的变量类型,也没有可以直接为其分配方法名的变量

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


你能做到这一点并不意味着你应该做到这一点。除了一些特殊情况外,这会导致代码更难理解和维护。

没有问题,因为在
arpan()
中定义的
arpan
是一个局部变量,在java中定义与类变量同名的局部变量非常有效,它被称为

没有问题,因为在
arpan()
中定义的
arpan
是一个局部变量,在java中定义与类变量同名的局部变量非常有效,它被称为

@ajb:谢谢!!哇,我不知道这一点,但我想我应该知道,Java使域保持相当独立。@ajb:谢谢!!哇,我不知道这一点,但我想我应该知道,Java使域保持相当独立。