【问题标题】:Having a same variable in both sub and super classes在子类和超类中具有相同的变量
【发布时间】:2014-11-22 21:08:07
【问题描述】:

在这个问题中,输出为 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();
  }
}

【问题讨论】:

  • 在子类范围内,子类变量隐藏了超类。这就是正在发生的一切。

标签: java


【解决方案1】:

首先,子类中的变量i隐藏超类中的变量。所以如果你想访问_39.i,你必须在Rosea中写super.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 指的是Roseas 版本的i,因为_39.i 是隐藏的。

Java 中的所有方法都是虚拟的,即对象的运行时类型决定了调用哪个方法。 (即使调用是从超类中进行的。)

进一步阅读:

【讨论】:

    【解决方案2】:

    派生类中的同名变量隐藏基类中的变量。所以在函数Rosea::foo()中,将使用派生类的i。正如你在问题中所写,如果你想使用基类的i,你必须明确写super.i

    【讨论】:

      猜你喜欢
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 2015-11-29
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多