【问题标题】:Trying to understand super() behavior试图理解 super() 行为
【发布时间】:2015-12-23 08:32:37
【问题描述】:

我正在学习我的 java 认证,我遇到了这段代码。

class Feline {
    public String type = "f ";
    public Feline() {
        System.out.print("feline ");
    }
}
public class Cougar extends Feline {
    public Cougar() {
        System.out.print("cougar "); 
    }
    public static void main(String[] args) {
        new Cougar().go();
    }
    void go() {
        type = "c ";
        System.out.print(this.type + super.type);
    }
}

当我运行它时,我得到“feline cougar c c”,所以我明白为什么它在它之后返回 feline 和 cougar 但为什么 super.type 指的是 Cougar 对象而不是 Feline 对象?

我看到了this post,但并没有真正启发我。

【问题讨论】:

标签: java


【解决方案1】:

super.type 只是指与this.type 相同的变量...只涉及一个对象,因此只涉及一个字段。

当您创建子类的实例时,它不会创建两个单独的对象,一个用于超类,一个用于子类 - 它创建一个可以被视为超类或子类的对象。它有一组字段。在这种情况下,您有一个字段 (type),它最初的值为 "f ",但随后其值更改为 "c "

【讨论】:

  • 感谢非常干净的解释 :-)
【解决方案2】:

只有一个type 变量。您的Cougargo() 方法将其设置为“c”。 因此this.typesuper.type 都打印c

【讨论】:

    【解决方案3】:

    this-> 调用当前类 :Cougar super-> 调用 Feline 猫科动物是美洲狮的超类,因为美洲狮继承自猫科动物。如果你想在 Cougar 中使用 Feline 类字段,你应该使用 super。

    你可以看到:http://www.instanceofjava.com/2015/03/this-vs-super-keywords.html

    【讨论】:

      【解决方案4】:

      为了完整起见,我想在这里再添加一件事

          public Cougar() {
              System.out.print("cougar "); 
          }
      

      这个构造函数被编译器这样翻译

          public Cougar() {
              super(); // Added by compiler if not added explicitly by programmer
              System.out.print("cougar "); 
          }
      

      这就是为什么你首先得到feline,然后在输出中得到cougar。 除此之外,如其他答案中所述,只涉及一个type 变量,因此它们都打印c

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-18
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-17
        相关资源
        最近更新 更多