Java类toString方法无输出问题及构造器优化咨询
问题分析与解决方案
我来帮你解决这两个问题:程序运行无输出,以及构造器写法的优化建议。
1. 运行无输出的原因与修复
你的程序没有输出,核心原因是你调用了toString()方法但没有将结果打印到控制台。toString()只是返回一个字符串对象,不会自动输出,必须通过System.out.println()来展示结果。
另外,我还发现两个容易忽略的问题:
CoffeeBagOrder的calculateSalesBeforeTax方法里用了硬编码的5.50,但类里已经定义了PRICE_PER_KG = 5.55,两者不一致,应该统一使用常量。- 输入逻辑里变量名搞反了:你把袋子数量赋值给了
unitWeight,把单袋重量赋值给了numberOfUnits,会导致计算结果完全错误。
修改后的核心代码
Tester类(修复输入逻辑与输出问题)
import java.util.Scanner; public class Tester { public static void main (String[] args) { Scanner sc= new Scanner(System.in); System.out.print("Enter number of bags sold: "); int numberOfUnits=sc.nextInt(); // 修正变量名对应关系 System.out.print("Enter weight of bags in kilograms: "); int unitWeight=sc.nextInt(); CoffeeBagOrder customer=new CoffeeBagOrder(unitWeight, numberOfUnits); System.out.println(customer); // 自动调用toString并打印结果 } }
CoffeeBagOrder类(修复常量使用问题)
public double calculateSalesBeforeTax() { salesBeforeTax= unitWeight * numberOfUnits * PRICE_PER_KG; // 使用类常量替代硬编码 return salesBeforeTax; }
2. 构造器写法的优化建议
你的构造器可以更简洁高效,具体优化点如下:
针对Order抽象类
- 成员变量可以直接在声明时初始化,不需要在默认构造器里重复赋值(JVM会给int类型默认赋0,但显式初始化更清晰):
int unitWeight = 0, numberOfUnits = 0; - 默认构造器可以简化为空实现,甚至如果不需要手动调用默认构造器,可以直接去掉(编译器会在需要时自动生成):
public Order() { // 空构造器,保留的话可以留空 }
针对CoffeeBagOrder类
- 空的默认构造器可以直接去掉,因为父类已有默认构造器,编译器会自动生成子类的默认构造器,无需手动编写空实现。
calculateSalesTax方法可以复用父类的SALES_TAX常量,避免硬编码0.10,提升代码可维护性。
优化后的完整类代码
Order类
public abstract class Order implements OrderInterface { final static double SALES_TAX = 0.1; // 直接初始化成员变量 int unitWeight = 0, numberOfUnits = 0; public Order() { // 空构造器(若无需手动调用可直接删除) } public Order(int unitWeight, int numberOfUnits) { this.unitWeight = unitWeight; this.numberOfUnits = numberOfUnits; } public void numberOfItems(int number) { numberOfUnits = number; } public void unitWeight(int weight) { unitWeight = weight; } }
CoffeeBagOrder类
public class CoffeeBagOrder extends Order implements Sales { final static double PRICE_PER_KG = 5.55; double salesBeforeTax; double tax; double totalSales; // 去掉空的默认构造器,编译器自动生成 public CoffeeBagOrder(int unitWeight, int numberOfUnits) { super(unitWeight, numberOfUnits); } public double calculateSalesBeforeTax() { salesBeforeTax= unitWeight * numberOfUnits * PRICE_PER_KG; return salesBeforeTax; } public double calculateSalesTax() { tax = salesBeforeTax * SALES_TAX; // 复用父类常量 return tax; } public double calculateTotalSales() { totalSales = salesBeforeTax + tax; return totalSales; } @Override // 加上@Override注解,明确是重写父类方法,更规范 public String toString() { return "Price before tax: "+calculateSalesBeforeTax()+"\nTax: "+calculateSalesTax()+"\nTotal price: "+calculateTotalSales(); } }
内容的提问来源于stack exchange,提问作者hannawants
相关产品推荐
相关产品推荐

