You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 03:43:15