使用Sub类引用调用成员

时间:2014-07-15 09:00:16

标签: java

我只使用ChildTest引用调用ChildTest类方法,即

ChildTest child = new ChildTest(); // not dynamic dispatching. 

我的问题是为什么child.foo()输出是Test foo,名为10

class Test {
    int x = 10;

    public void foo() {
        System.out.println("Test foo called " + x);

    }

    public static void main(String args[]) {
        ChildTest child = new ChildTest();

        System.out.println(child.x);
        child.foo();
        child.bar();
    }
}

class ChildTest extends Test {
    int x = 20;

    public void bar() {
        System.out.println("ChildTest Bar called " + x);
    }
}

4 个答案:

答案 0 :(得分:0)

无法在Java中覆盖变量,因此您所做的就是hidden原始x变量。

您在x课程中添加了变量ChildTest并将其赋值为20这一事实不会影响x中的变量Test } class,仍然是10

方法foo()仍然驻留在Test类中,这意味着它将使用该类中声明的x变量。如果您希望通过ChildTest引用查看不同的呼叫输出,可以添加getX()方法并覆盖它:

class Test {
    public int getX() {
        return 10;
    }
    public void foo() {
        System.out.println("Test foo called " + getX());
    }
    ...

class ChildTest extends Test {
    @Override
    public int getX() {
        return 20;
    }
    ...

答案 1 :(得分:0)

ChildTest中的行int x = 20;声明了一个名为x单独的变量。然后,ChildTest的一个实例有两个名为x的无关变量,一个来自Test,值为10,另一个来自ChildTest,值为20.类Test中的代码只能看到它自己声明的变量,这就是它看到值的原因10。

如果你想让ChildTest修改值而不是创建一个单独的变量,添加一个构造函数(或初始化程序块)并在那里设置变量而不重新声明它:

class ChildTest extends Test {
    ChildTest() {
        x = 20;
    }

    public void bar() {
        System.out.println("ChildTest Bar called " + x);
    }
}

答案 2 :(得分:0)

原因是没有办法覆盖Java中的变量,你正在做的就是隐藏它。

然后,由于main方法在Test类的上下文中,变量的值为10,为了得到20,你应该在ChildTest类的上下文中,或者设置{{1}的值。 1}}通过初始化块,构造函数或类似的东西。

以下是更多信息:  Is there a way to override class variables in Java?

答案 3 :(得分:0)

childChildTest的对象引用,当您调用像foo()这样的child.foo()方法时,它会查找ChildTest类中的方法,但是它没有这样的方法,但是当它发现它继承了一个具有Test方法的foo()类的类时,然后它执行它并使用{{的实例变量1}} class。