Java 如何检测某物是形式参数还是实例数据?

How does Java detect if something is a formal parameter or instance data?

我正在尝试弄清楚 Java 如何决定(如果这听起来像是我在拟人化 Java,请原谅)哪些变量被视为实例数据,哪些变量被视为正式数据参数。我知道采用适当的编码技术可以避免这种混淆,但我只是对其背后的逻辑感到好奇。在以下示例中:

public Foo{
    int a, b, c;

    //this assigns the formal parameters' values to the instance data's values
    public Foo(int x, int y, int c){
        a = x; //makes sense 
        this.b = y; //makes sense
        c = c; //how?
    }

    //how can you tell which value is being dealt with
    public int getBar(int a, int b, int c){
        if(b < (b - b))
            a += 5;
        else
            a += a;
        b = b;
        b += c;
        return b;
    }
}

构造函数,Foo(),形参都被复制到实例数据中。这对于前两个作业来说很明显,但是第三个作业是我开始有一些问题的地方。 Java 如何知道要使用哪个 "c"?存储实例数据的那个还是表示形参的那个?在第二个函数中(对不起,如果这个例子太极端了),你 know/how 将如何 Java 决定哪些变量代表实例数据,哪些变量代表形式参数。

基本上参数和局部变量只是优先于字段。这叫做shadowing of the variable or name。所以 c=c 在你的代码中什么都不做;它将 c 的值分配给自己。

this 关键字告诉 Java 你想引用一个实例变量。大多数时候,这是可选的。问题是有时会有两个同名的变量。在构造函数中,一个是参数,一个是实例变量。不说的话,Java给你的是范围最细的一个,也就是参数。