【问题标题】:(Java) How to call a overriden "inherited" method from the super class? [duplicate](Java)如何从超类调用重写的“继承”方法? [复制]
【发布时间】:2018-05-24 09:54:02
【问题描述】:

我们直接上代码:

父亲.java:

public class Father {

    public void DoSmth(Father object) {
        // Do something else and print
        Print(object);
    }

    public void Print(Father object) {
        System.out.println("Father");
    }

}

儿子.java:

public class Son extends Father {

    public void Print(Son object) {
        System.out.println("Son");
    }

}

Main.java:

public class Main {

    public static void main(String[] args) {

        Father o1 = new Father();
        Son o2 = new Son();

        o1.DoSmth(o1);
        o1.DoSmth(o2);

    }

}

所以,我想得到:

Father
Son

但是,我明白了:

Father
Father

我真的不太明白为什么(对于 o1.DoSmth(o2))它从父类调用方法,因为 o2 是 Son 类型。反正我能得到想要的答案吗?

提前致谢

P.S.:实际上,我想从父类内部调用(子类的)方法 Print。有可能吗?

【问题讨论】:

  • 您从Father 调用该方法,就像您从o1 实例调用它一样。
  • @Seelenvirtuose 是的,这是一个错误,但不,这不是唯一的错误。 Eran 的答案是正确的。
  • 不相关:在 java 中,方法名称采用驼峰式,而不是 C# 中的大写。不遵循这样的约定会让你的读者感到困惑。

标签: java class methods overriding inherited


【解决方案1】:

public void Print(Son object) 不会覆盖 public void Print(Father object)。它超载了它。

也就是说,DoSmth(Father object) 在两种情况下都在 Father 实例上执行,因此即使 Son 类确实覆盖了它,它也会调用 Father 类的 public void Print(Father object)

如果您将Son 类方法更改为:

@Override
public void Print(Father object) {
    System.out.println("Son");
}

并将您的 main 更改为:

public static void main(String[] args) {
    Father o1 = new Father();
    Son o2 = new Son();

    o1.DoSmth(o1);
    o2.DoSmth(o2);
}

你会得到输出

Father
Son

【讨论】:

  • @Seelenvirtuose 在确定性输出方面没有同意和不同意的概念。这些调用不会打印Son
  • 是的。我错了。方法Print(Son object) 永远不能通过DoSmth 方法调用来调用。这个答案非常正确。
  • 嘿,是的,在没有阅读您所写的所有内容的情况下,我就下定了决心。我的错。
  • 我不得不承认我的解释有点不对劲。现在修好了。我的回答好像是在调用 object.Print(object); 而不是 Print(object);
  • @R.Thomes 如果你想让Parent 对象调用Son 类的Print 方法,也许你想从DoSmth 调用object.Print(object)(在这种情况下你可以只需删除Print 方法的参数并调用object.Print())
【解决方案2】:

这是因为您在父实例上调用 Print 方法。如果您不将对象作为参数传递并调用 object.Print() 您应该得到预期的结果

【讨论】:

  • 其实我需要传参数(本例中没有,实际情况下)。所以,如果我在“DoSmth”中写“object.Print(object)”,它确实有效!但前提是我在 Son 类中写“public void Print(Father object)”。如果我保留“public void Print(Son object)”,它就不起作用,我不明白为什么。你能帮帮我吗?
猜你喜欢
  • 2019-01-19
  • 1970-01-01
  • 2011-10-17
  • 2010-10-18
  • 1970-01-01
  • 2015-01-14
  • 2015-03-07
  • 1970-01-01
  • 2015-07-15
相关资源
最近更新 更多