在子类和超类中都有相同的变量

时间:2014-09-28 09:34:50

标签: java

在这个问题中,输出为Rose0。但是当我通过逻辑时,我觉得答案必须是Rose100而不是Rose0。编译器如何区分两个类中的i。由于Rosea延伸_39级,因此它也拥有超级I级。但是在第1行,如果我改变super.i然后我得到Rose100。这有何不同?

class _39 {
  int i;

  _39(){
    i=100;
    foo();
  }

  public void foo(){
    System.out.println("Flower"+i);}
  }
}

public class Rosea extends _39{

  int i=200;

  Rosea(){ 
      i=300;
  }

  public void foo(){
    System.out.println("Rose"+i);
  } //line 1

  public static void main(String[] args) {
    new Rosea();
  }
}

2 个答案:

答案 0 :(得分:5)

首先,子类中的变量i隐藏超类中的变量。因此,如果您想访问super.i,则必须在Rosea中撰写_39.i

第二:即使你在超类中调用foo,也会调用子类中的实现。

...

    _39() {
        i = 100;
        foo();     <--------------- this calls this
    }                                            |
                                                 |
...                                              |
                                                 |
public class Rosea extends _39 {                 |
    ...                                          |
    public void foo() {                  <-------'
        System.out.println("Rose" + i);
    }
    ...
}

Rosea.foo i引用了Rosea i_39.i,因为隐藏了{{1}}。

Java中的所有方法都是虚拟的,即它是确定调用哪个方法的对象的运行时类型。 (如果调用是在超级类中进行的话,则为。)

进一步阅读:

答案 1 :(得分:1)

派生类中具有相同名称的变量隐藏基类中的变量。因此,在函数Rosea::foo()中,将使用派生类的i。正如您在问题中所写,如果您想使用基类的i,则必须明确写出super.i