有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

父对象的java调用方法,即使子对象重写它?

假设我有一个这样的班级:

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)


共 (2) 个答案

  1. # 1 楼答案

    这称为子类重写的方法。类“Alpha”已重写方法“toString”。如果未指定,则类对象是默认的超类

    您可以在重写的方法中捕获super的toString,并将其追加/前置到响应中

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

    如果子类重写方法,则无法再从另一个类调用被重写的方法。这是没有办法的

    使用反射无助于:

    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]"
    

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