Java中如何以实现接口的类实例为参数计算BMI?
问题分析与解决方案
核心问题
你遇到的NaN问题,根源不是误用接口作为参数类型,而是接口Physique里定义的height和weight是静态常量(Java接口中变量默认是public static final),和John类里的实例变量完全无关。当你在BMI.calculate中调用physique.height时,实际取的是接口里的默认值0,计算0 / Math.pow(0,2)自然得到NaN。
正确实现步骤
要让calculate方法支持所有符合“有身高体重”的类,需重新设计接口,让它提供获取实例属性的方法,而非定义常量:
修正
Physique接口
改成定义getter方法,让实现类提供自己的身高体重:public interface Physique { // 提供获取身高的方法(单位:厘米) int getHeight(); // 提供获取体重的方法(单位:千克) int getWeight(); }修改
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; } }修正
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); } }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
相关产品推荐
相关产品推荐

