Java超类调用在子类中创建的方法

时间:2016-06-05 21:45:13

标签: java inheritance

我有关于继承和绑定的问题。

如果我在子类中创建一个新方法,并尝试使用超类引用调用它,该怎么办?

我知道它会首先检查类型,然后检查对象。 因此,根据规则,这不起作用,因为此方法未在超类中声明。

但是没有办法克服它吗?

我的意思是继承意味着你必须在超类中声明每一个方法,如果你想为子类改变一些东西,你只能覆盖它吗? 所以,如果我突然意识到,我的一个子类确实需要一个特殊的方法,或者需要重载,那么我是否会被迫先在超类中声明它或者完全忘记它?

3 个答案:

答案 0 :(得分:1)

  

因此,如果我突然意识到,我的一个子类确实需要一个   特殊的方法,或需要超载,然后我被迫   首先在超类中声明它或者完全忘记它?

还有第三种选择。在子类中声明方法。在需要调用该方法的代码中,将引用强制转换为子类类型。如果引用没有真正指向该子类的对象,则会得到ClassCastException。

如果你最终不得不做这种事情,你应该在下一次重构过程中再看看它,看看它是否可以被平滑掉。

public class Test {
  public static void main(String[] args) {
    System.out.println(new Test().toString());
    Test sub = new TestSub();
    System.out.println(sub.toString());
    ((TestSub)sub).specialMethod();
  }

  @Override
  public String toString(){
    return "I'm a Test";
  }
}

class TestSub extends Test {
  void specialMethod() {
    System.out.println("I'm a TestSub");
  }
}

答案 1 :(得分:0)

在超类中创建一个抽象方法(并将super更改为抽象类),然后在超类中调用抽象方法。

答案 2 :(得分:0)

扩展DwB的答案:创建一个默认的无操作方法。

public class Super {
    public void special() {
        // no-op
    }
}

public class Sub extends Super {
    @Override public void special() {
        System.out.println("Now I do something");
    }
}