Java 使用子类方法的超类方法

Java 使用子类方法的超类方法,java,overriding,subclass,superclass,super,Java,Overriding,Subclass,Superclass,Super,对不起,这个问题模棱两可,但我发现很难把标题说对 我有一个超类,它有一个名为calculateTotal()的方法和一个名为toString()的方法。 我还有一个子类覆盖这两个方法 我遇到的问题是,当我从子类调用toString()时,super.toString()部分返回一个字符串,其值是从子类的calculateTotal()返回的。 因此,我得到的总计和总计的值是相同的,两者都是handlingFee的附加值 为了说明这个问题,下面是一个示例输出 预计产出:总计20美元,外加4美元的手

对不起,这个问题模棱两可,但我发现很难把标题说对

我有一个超类,它有一个名为calculateTotal()的方法和一个名为toString()的方法。 我还有一个子类覆盖这两个方法

我遇到的问题是,当我从子类调用toString()时,super.toString()部分返回一个字符串,其值是从子类的calculateTotal()返回的。 因此,我得到的总计和总计的值是相同的,两者都是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());
    }
}

当您有一个子类的实例时,您也没有一个单独的超类实例。因此,当超级类方法调用
calculateTotal()
时,它会调用为该签名定义的最低(子类链下)方法


听起来您可能希望在子类中不重写calculateSubTotal()方法,因为您不知道超类中的小计计算是如何被子类更改的。

这种模式在JDK或中经常出现,超类是一个抽象类,如下所示:

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

如果不希望子类的
calculateTotal()
覆盖超类的版本,则应为其指定其他名称,或将超类的版本设置为私有。不确定子类如何访问unitPrice,因为它在超类中声明为私有。您通常可以通过使用调试器单步处理这些类型的问题,或通过添加日志记录语句来查看发生的情况。调试器不会帮助OP,也不会帮助日志记录。他/她确切地知道发生了什么,他/她只是不喜欢。谢谢你,我想我对面向对象设计的理解还不够。我真的很感谢你的帮助!谢谢你的解释。我希望调用超级类方法也会自动使用被调用的任何其他方法的超级版本。我不知道它在寻找同名的最低级方法。谢谢你在学习过程中帮助我。