简单的继承但令人困惑

ans*_*tta -3 java

这是JavaTest类

package testing.test;

public class JavaTest 
{
    int i=2;
}
Run Code Online (Sandbox Code Playgroud)

这是JavaTest2类,它扩展了JavaTest

package testing.test;

class JavaTest2 extends JavaTest
{
    public static void main(String[] args) {


        new JavaTest2().add(5);
    }

    void add(int i)
    {
        System.out.println(5+i);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在输出到10,实际问题是得到父类的i值添加..

Lui*_*oza 7

在这里是你的add方法阴影i类与属性i声明为参数变量.因此,在使用iinside add方法时,您使用的是i参数,而不是i属性.

要注意区别,请将add方法更改为:

void add(int i) {
    System.out.println(5+i);
    System.out.println(5+this.i); //this will do the work for you
}
Run Code Online (Sandbox Code Playgroud)

类构造函数使用阴影的一个很好的例子:

public class SomeClass {
    int x;
    public SomeClass(int x) {
        //this.x refers to the x attribute
        //plain x refers to x parameter
        this.x = x;
    }
}
Run Code Online (Sandbox Code Playgroud)

跟进评论:

得到它,但如果我在JavaTest2中拥有与i相同的成员会发生什么......并且做同样的事情.i

这称为隐藏,在Oracle的Java教程:隐藏字段中有很好的解释

例:

class JavaTest2 extends JavaTest {
    int i = 10;
    void add(int i) {
        System.out.println(5+i);
        System.out.println(5+this.i); //this will add 5 to i attribute in JavaTest2
        System.out.println(5+super.i); //this will add 5 to i attribute in JavaTest
    }
}
Run Code Online (Sandbox Code Playgroud)