【问题标题】:call method of parent even if child overrides it? [duplicate]即使孩子覆盖它,也调用父母的方法? [复制]
【发布时间】:2019-12-22 00:44:15
【问题描述】:

想象一下我有这样的课程:

public class Alpha {

   int i = 5;

   @Override
   public String toString() {
       return "Alpha [i=" + i + "]";
   }

   public String superToString() {
       return super.toString();
   }

}

然后我做一个主要的:

Alpha o = new Alpha();
System.out.println(o.toString()); // display ==> Alpha [i=5]
System.out.println(o.superToString()); // display ==> pojos.Alpha@77468bd9

一切正常。 现在,想象一下我在 Alpha 中没有名为 superToString() 的方法。 有没有办法调用我的 Alpha 实例的父方法? (在这个例子中,对象的 toString)

【问题讨论】:

  • 据我所知,只能通过反射。
  • 我们为什么会这样想?如果您控制该类的源代码,只需添加该方法即可。

标签: java overriding hierarchy extends


【解决方案1】:

如果子类重写了一个方法,就不能再从另一个类调用被重写的方法。没有办法解决这个问题。

使用反射无济于事:

var alpha = new Alpha();
var aMethod = alpha.getClass().getSuperclass().getMethod("toString");
System.out.printf("For method %s() in super class %s the call still results in \"%s\"%n",
        aMethod.getName(), aMethod.getDeclaringClass().getSimpleName(),
        aMethod.invoke(alpha));

结果:

For method toString() in super class Object the call still results in "Alpha [i=5]"

问题在于,任何允许您这样做的机制都会从根本上破坏封装和抽象。

【讨论】:

  • 使用反射没有帮助所以这不起作用:getClass().getSuperclass().getMethod("toString")
  • @Abra 这是一个等待发生的问题、陈述、肯定还是答案?
  • @Abra 那行不通。试试吧
  • 嗯,当然是骗人的。哦,好吧,至少它比重复问题中的大多数例子更好。
  • @Marteen - 感谢您添加示例
【解决方案2】:

这被称为被子类覆盖的方法。类“Alpha”已覆盖方法“toString”。如果未指定,Class Object 是默认的超类。

您可以在重写的方法中捕获 super 的 toString 并将其附加/添加到响应中

@Override
public String toString(){
  String superToString = super.toString();
  return superToString + " -> Alpha [i=" + i + "]";
}

【讨论】:

  • 你不明白。我知道你所解释的一切,但我只是不想那样做。想象一下 Alpha 无法编辑,所以我们不能在这个“子类”中使用关键字 super。问题是:当我“使用”Alpha 时,我可以强制使用父(对象)的 toString() 吗?
  • 你在这里有点自相矛盾。你说你有一个类并展示了它的源代码,所以很明显你控制了那个源代码。如果您不这样做,请更新您的帖子以提供更多详细信息。
  • 您不能从子类的实例中强制父级的 toString()。正如其他答案中所解释的那样,反思也无济于事。如果您控制子类的源,这是捕获它的一种方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 2020-09-20
  • 2016-08-02
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
相关资源
最近更新 更多