Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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 - Fatal编程技术网

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.
            }
        }
    }
}