使用子类方法的超类方法

时间:2014-05-13 02:32:49

标签: java override subclass superclass super

抱歉这个问题含糊不清,但我发现很难说出这个标题。

我有一个名为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());
    }
}

2 个答案:

答案 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");
    }
}