//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
我可以通过使用隐式引用变量(int a
)来区分数据成员(int a
)和形式参数(this
)。我的问题是,如何区分同一类中的数据成员(int a
),形式参数(int a
)和局部变量(int a
)?
答案 0 :(得分:-1)
你不能有一个形式参数和一个同名的局部变量,这是一个编译错误:
变量
中定义a
已在方法ex(int)
所以没有提出如何区分它们的问题。只要给他们不同的(理想上有意义的)名字。
正如您所指出的,实例变量(数据成员)与形式参数/局部变量的问题通过this.
处理
答案 1 :(得分:-1)
此代码应明确说明:
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.
}
}
因此,这里有两个范围,本地范围和对象/类范围。不能在同一范围内声明具有相同名称的两个变量。编译器将引用的变量是在最深的范围内找到的变量。
另一个更复杂的例子:
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.
}
}
}
}
此处有四个嵌套范围(Test
类,aMethod
正文,LocalClass
类和bMethod
正文。每个变量都将位于最深的范围内。可以使用this
或类名引用(如Test.e
)引用阴影变量(有时)。如果this
本身被遮蔽,则可以使用ClassName.this
语法。
阴影被认为是一种不好的做法,因为它给不同的东西赋予相同的名称,造成混乱,并且几乎没有理由这样做(虽然在setter参数遮蔽同一类的字段的情况下可以容忍)。所以,请避免这样做。