如何为变量赋值super?

时间:2013-02-26 17:02:57

标签: java

我想做以下事情:

public class Sub extends Super {
  public Sub(Super underlying) {
    if (underlying == null) {
      underlying = super; // this line is illegal
    }

    this.underlying = underlying;
  }

  @Override
  public void method() {
    underlying.method();
  }
}

这样的事情怎么办?

4 个答案:

答案 0 :(得分:1)

您还没有正确理解java中的super关键字。请参阅javadoc for super

  

如果您的方法覆盖了其超类的方法之一,则可以通过使用关键字super来调用重写方法。您也可以使用super来引用隐藏字段(尽管不鼓励隐藏字段)

此外,super()用于调用父类构造函数。

答案 1 :(得分:0)

看起来您想要实现delegation pattern

简单扩展Super,让IDE通过创建超级调用来覆盖所有方法。

然后替换“超级”。与“潜在的。”

容易出错,但就是这样。

public class Sub extends Super {
    Super underlying;
    public Sub(Super underlying) {
        this.underlying = underlying;
    }

    @Override
    public void f() {
        underlying.f();
    }

答案 2 :(得分:0)

public class Sub extends Super {
  public Sub(Super underlying) {
    this.underlying = (underlying == null)
        ? new Super()
        : underlying;
  }

  @Override
  public void method() {
    underlying.method();
  }
}

由于正在创建另一个对象,它并不完全相同,但它的行为与预期的一样。

答案 3 :(得分:0)

如果您愿意为所涉及的方法添加和调用子类特定的方法名称,我认为可以完成您想要的内容:

public class Test {
  public static void main(String[] args) {
    Super sup = new Super();
    Sub sub1 = new Sub(null);
    Sub sub2 = new Sub(sup);
    sub1.subMethod();
    sub2.subMethod();
    sup.method();
  }
}

class Super {
  public void method(){
    System.out.println("Using method from "+this);
  }
}

class Sub extends Super {
  private Super underlying;
  public Sub(Super underlying) {
    if (underlying == null) {
      underlying = this;
    }

    this.underlying = underlying;
  }

  public void subMethod() {
    underlying.method();
  }
}