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

Java中如何以实现接口的类实例为参数计算BMI?

问题分析与解决方案

核心问题

你遇到的NaN问题,根源不是误用接口作为参数类型,而是接口Physique里定义的height和weight是静态常量(Java接口中变量默认是public static final),和John类里的实例变量完全无关。当你在BMI.calculate中调用physique.height时,实际取的是接口里的默认值0,计算0 / Math.pow(0,2)自然得到NaN。

正确实现步骤

要让calculate方法支持所有符合“有身高体重”的类,需重新设计接口,让它提供获取实例属性的方法,而非定义常量:

  1. 修正Physique接口
    改成定义getter方法,让实现类提供自己的身高体重:

    public interface Physique {
        // 提供获取身高的方法(单位:厘米)
        int getHeight();
        // 提供获取体重的方法(单位:千克)
        int getWeight();
    }
    
  2. 修改John类实现接口方法
    实现Physique的getter,同时修正构造函数的调用问题(原Main中传了2个参数,但John构造需要3个,这里新增适配的构造函数):

    public class John implements Physique {
        int height;
        int weight;
        int age;
    
        // 新增不带age的构造,适配Main的调用
        public John(int height, int weight) {
            this.height = height;
            this.weight = weight;
        }
    
        public John(int height, int weight, int age) {
            this.height = height;
            this.weight = weight;
            this.age = age;
        }
    
        @Override
        public int getHeight() {
            return this.height;
        }
    
        @Override
        public int getWeight() {
            return this.weight;
        }
    }
    
  3. 修正BMI.calculate方法
    通过接口的getter获取实例的真实属性,同时注意BMI的正确计算公式:体重(kg) ÷ (身高(m))²,所以要把厘米转成米:

    public class BMI {
        public static void calculate(Physique physique) {
            // 把身高从厘米转为米
            double heightInMeter = physique.getHeight() / 100.0;
            double bmi = physique.getWeight() / Math.pow(heightInMeter, 2);
            // 格式化输出保留两位小数
            System.out.printf("BMI值为:%.2f%n", bmi);
        }
    }
    
  4. Main类保持原调用即可

    public class Main {
        public static void main(String[] args) {
            John john = new John(182, 68);
            BMI.calculate(john); // 输出:BMI值为:20.57
        }
    }
    

扩展支持其他人物类

如果后续新增Alice类,只需让它实现Physique接口,实现getHeight和getWeight方法,就能直接传入BMI.calculate方法,完全满足复用需求。


内容的提问来源于stack exchange,提问作者William Le

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 02:45:13