如何在同一类的上下文中区分形式参数,局部变量和数据成员

时间:2018-02-15 16:09:38

标签: java

//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)?

2 个答案:

答案 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参数遮蔽同一类的字段的情况下可以容忍)。所以,请避免这样做。