Java动态方法调度实现利息计算时结果始终为0?
问题分析与解决方案
核心问题
父类Interest的display方法中,错误创建了一个新的Interest对象并给它的成员变量赋值,而非给当前调用方法的对象(子类实例)的成员变量赋值。导致子类SI/CI的p、r、t始终是默认值0,最终利息计算结果为0。此外,原代码还存在整数除法精度丢失、复利公式逻辑错误的问题。
修正步骤
- 删除父类
display方法中多余的Interest ob = new Interest();语句,直接给当前对象的成员变量赋值。 - 将整数除法中的常量改为浮点数(如
100改为100.0),避免精度丢失。 - 修正复利计算公式,正确实现“本金×(1+利率)^期数 - 本金”的逻辑。
修正后的完整代码
import java.util.*; class Interest { int p, r, t; void display() { Scanner sc = new Scanner(System.in); System.out.println("------Interest Calculation------"); System.out.print("Enter Principal Amount: "); p = sc.nextInt(); System.out.print("Enter Rate of Interest: "); r = sc.nextInt(); System.out.print("Enter Years: "); t = sc.nextInt(); } } class SI extends Interest { void display() { super.display(); // 用100.0触发浮点数除法,避免整数运算丢失精度 double i = (p * r * t) / 100.0; System.out.println("Simple Interest: " + i); } } class CI extends Interest { void display() { super.display(); // 修正复利公式,确保利率计算为浮点数 double i = p * Math.pow(1 + r / 100.0, t) - p; System.out.println("Compound Interest: " + i); } } class Money { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Interest ob; System.out.println("1. Simple Interest"); System.out.println("2. Compound Interest"); System.out.println("Enter your choice: "); int ch = sc.nextInt(); switch (ch) { case 1: ob = new SI(); ob.display(); break; case 2: ob = new CI(); ob.display(); break; default: System.out.println("Wrong Choice!"); break; } } }
关键说明
- 动态方法调度逻辑本身是正确的:父类引用指向子类对象时,会自动调用子类的
display实现。 - 修正后,用户输入的数值会正确绑定到当前子类实例的成员变量,计算时使用实际输入值,同时解决了精度丢失和公式错误问题。
内容的提问来源于stack exchange,提问作者Zethyst
相关产品推荐
相关产品推荐

