我有一个名为calculateTotal()的方法的超类和一个名为toString()的方法。 我还有一个子类可以覆盖这两种方法。
我遇到的问题是,当我从子类调用toString()时,super.toString()部分返回一个字符串,其中包含来自子类的calculateTotal()返回的值。 因此,我为Total:和Grand Total:获得相同的值,两者都是handlingFee添加的值。
为了说明问题,这是一个示例输出。
预期产量:总计:20,加上4美元的手续费,总计:24美元
当前输出:总计:24,加上4美元的手续费,总计:24美元
任何帮助或建议将不胜感激!谢谢,
代码:
超级班:
public class SuperClass {
private double unitPrice;
private int quantityOrdered;
public double calculateTotal() {
return unitPrice * quantityOrdered;
}
public String toString() {
return String.format("\nUnit Price: %.2f\nQuantity Ordered: %d\nTotal: %.2f", unitPrice, quantityOrdered, calculateTotal());
}
}
子类:
public class SubClass extends SuperClass {
private double handlingFee;
public double calculateTotal() {
return unitPrice * quantityOrdered + handlingFee;
}
public String toString() {
return String.format("%s\nPlus a $%.2f handling charge\nGrand Total: $%.2f", super.toString(), handlingFee, calculateTotal());
}
}
答案 0 :(得分:0)
当您拥有子类的实例时,您也没有单独的超类实例。因此,当超类方法调用calculateTotal()
时,它会调用为该签名定义的最低(在子类链下方)方法。
听起来你可能想要一个未在子类中重写的calculateSubTotal()方法,因为你没有要通过子类改变超类中小计的计算。
答案 1 :(得分:0)
这种模式经常出现在JDK或Spring Framework中,超类是一个抽象类,如下所示:
public abstract class A {
public void method1(){
method2();
}
public abstract void method2 ();
}
public class B extends A {
@Override
public void method2(){
System.out.println("method2 has been called");
}
}