Java 如何在同一类的上下文中区分形式参数、局部变量和数据成员
通过使用隐式引用变量(Java 如何在同一类的上下文中区分形式参数、局部变量和数据成员,java,Java,通过使用隐式引用变量(this),我可以区分数据成员(inta)和形式参数(inta)。我的问题是,如何区分同一类中的数据成员(inta)、形式参数(inta)和局部变量(inta)?形式参数和局部变量不能同名,这是一个编译错误: 变量a已在方法ex(int) 因此,如何区分它们的问题没有出现。只需给他们起不同的(理想意义上的)名字 正如您所注意到的,实例变量(数据成员)与形式参数/局部变量之间的问题是通过此代码处理的。此代码应明确: //Test.java class Demo {
this
),我可以区分数据成员(inta
)和形式参数(inta
)。我的问题是,如何区分同一类中的数据成员(inta
)、形式参数(inta
)和局部变量(inta
)?形式参数和局部变量不能同名,这是一个编译错误:
变量a
已在方法ex(int)
因此,如何区分它们的问题没有出现。只需给他们起不同的(理想意义上的)名字
正如您所注意到的,实例变量(数据成员)与形式参数/局部变量之间的问题是通过
此代码处理的。
此代码应明确:
//Test.java
class Demo
{
int a;//data member
void ex(int a)//formal parameter
{
int a = 100;//local variable
this.a = a;// here I am differentiating data member and formal
// parameter by using this keyword
System.out.println("Val of a = "+a);
}
}//Demo-------------->BLC
class Test
{
public static void main(String[] args)
{
Demo d = new Demo();
d.ex(10);
}
}//Test------------->ELC
因此,这里有两个级别的作用域,局部作用域和对象/类作用域。不能在同一范围内声明具有相同名称的两个变量。编译器将引用的变量是可以找到的最深作用域中的变量
另一个更复杂的例子:
public class Test {
private int b = 5; // Instance variable.
private int c = 7; // Instance variable.
private static int d = 7; // Static variable.
private static int e = 9; // Static variable.
public void aMethod(int a) { // a = formal parameter.
// Compile error. There is already a variable named "a" here, it is the parameter.
int a = 5;
int b = 5; // Local variable. Shadows the instance variable.
b = 6; // Assigns to local variable.
this.b = 6; // Assigns to instance variable.
c = 8; // Assigns to instance variable.
d = 9; // Assigns to static variable.
int e = 10; // Local variable;
e = 11; // Assigns to local variable.
Test.e = 12; // Assigns to static variable.
}
}
这里有四个嵌套范围(Test
class、aMethod
body、LocalClass
class和bMethod
body)。每个变量将位于可以找到它的最深范围内。阴影变量(有时)可以通过使用this
或类名引用(如Test.e
)来引用。如果this
本身被隐藏,则可以使用ClassName.this
语法
阴影被认为是一种不好的做法,因为它给不同的事物赋予了相同的名称,这会造成混乱,而且几乎没有理由这样做(尽管在setter参数对同一类上的字段进行阴影的情况下是允许的)。所以,请避免这样做。你不能,或者说不能。这就是为什么上面的代码不会编译并给出错误:重复局部变量aI同意你所说的,因为我编译了,但它显示了错误。但是当我把int b=100替换为int a=100时,它编译成功了。然后应该有一些方法来区分na。函数输入参数已经在函数的作用域中声明为本地。因此,您不能在具有输入参数
a
的函数中声明另一个局部变量a
。可以重写局部变量的值(a=100;
),但不能重新声明。您所做的工作与尝试编写inta=10的工作效率相同;INTA=11
@Vaibhavkumar:这就是你如何区分:不同的名字。没有其他方法可以区分,但你就是这样做的。(在Java、C、C#JavaScript、Basic和我使用过的几乎所有其他编程语言中。参数和本地之间通常没有符号上的区别。)旁注:有些人认为,即使没有命名冲突,您也应该始终在实例成员上使用。
,因此很明显您打算使用实例成员(如果没有相关名称,则会出现编译错误)。其他人认为这会使事情变得混乱。你和你的团队应该在这一点上达成一致的立场,然后始终如一地应用它(工具可以提供帮助)。
public class Test2 {
private int a = 5; // Instance variable.
public void aMethod(int a) { // a = formal parameter.
class LocalClass {
private int a;
public void bMethod() {
int a = 5; // Local to bMethod;
this.a = 6; // Instance of LocalClass.
Test2.this.a = 7; // Instance of Test2.
}
}
}
}