java - 我父母的类方法没有收到我的实例变量值
问题描述
我正在做一个脂肪百分比计算器,我正在扩展男士计算器,因为它具有基本相同的功能。发生的情况是我没有从女子班(父级)添加脂肪计算方法来尝试保存一些代码,但是当我创建男子班的实例并使用 fat 方法时,它没有收到我的值从男子班的一个方法得到。如果你能解释为什么我会很感激。
public class DC_Calculator_Women implements DC_Fat_Calculator{
private int age;
private int total_Pliegues;
private double DC;
protected double fatPercentage;
public DC_Calculator_Women(int age, int total_Pliegues) {
this.age = age;
this.total_Pliegues = total_Pliegues;
}
public double calculateDC() {
// • Mujeres: Densidad Corporal (DC) = 1.0994921 – (0.0009929 × Suma Pliegues) + (0.0000023 × Suma Pliegues al Cuadrado) – (0.0001392 × Edad)
DC = 1.0994921 - (0.0009929 * total_Pliegues) + (0.0000023 * (total_Pliegues * total_Pliegues)) - (0.0001392 * age);
return DC;
}
public double calculateFat() {
// • (%G) = [(4.95/Densidad Corporal) – 4.5] × 100
fatPercentage = ((4.95 / DC) - 4.5) * 100;
System.out.println(DC);
return fatPercentage;
}
}
public class DC_Calculator_Men extends DC_Calculator_Women{
private int age;
private int total_Pliegues;
private double DC;
public DC_Calculator_Men(int age, int total_Pliegues) {
super(age, total_Pliegues);
this.age = age;
this.total_Pliegues = total_Pliegues;
}
@Override
public double calculateDC() {
// • Hombres: Densidad Corporal (DC) = 1.1093800 – (0.0008267 × Suma Pliegues) + (0.0000016 × Suma Pliegues al Cuadrado) – (0.0002574 × Edad)
DC = 1.1093800 - (0.0008267 * total_Pliegues) + (0.0000016 * (total_Pliegues * total_Pliegues) - (0.0002574 * age));
return DC;
}
}
public class Main {
public static void main(String[] args) {
double DC;
double fat;
// Women
DC_Calculator_Women Wtest1 = new DC_Calculator_Women(25, 51);
DC = Wtest1.calculateDC();
fat = Wtest1.calculateFat();
System.out.printf("Women (DC): %5.2f\n", DC);
System.out.printf("Women (fat): %5.2f\n", fat);
// Men
DC_Calculator_Men Mtest1 = new DC_Calculator_Men(35, 40);
DC = Mtest1.calculateDC(); // **** DC in this method counts as 0 ***
fat = Mtest1.calculateFat();
System.out.printf("Men (DC): %5.2f\n", DC);
System.out.printf("Men (fat): %5.2f\n", fat);
}
}
解决方案
BUG:在子(男)类计算的 DC 值在父(女)类无法访问。
因此,每次子类使用父类的calculateFat()时,所引用的DC变量的值都是父类(未初始化,这是 0.0)
解决方案:我创建了一个 setter 方法 setWomenDC(double DC),用于在 parent(women) 类中设置 DC 的值。这将由 child(men) 类使用,同时为自身计算 DC 的值。使用它,它将在父(女性)类中为 DC 设置相同的值。
将此方法添加到 DC_Calculator_Women 类
//add this method to receive DC value from child(men) class
public void setWomenDC(double DC){
this.DC = DC;
}
在 DC_Calculator_Men 类中编辑 calculateDC() 方法
@Override
public double calculateDC() {
// • Hombres: Densidad Corporal (DC) = 1.1093800 – (0.0008267 × Suma Pliegues) + (0.0000016 × Suma Pliegues al Cuadrado) – (0.0002574 × Edad)
DC = 1.1093800 - (0.0008267 * total_Pliegues) + (0.0000016 * (total_Pliegues * total_Pliegues) - (0.0002574 * age));
setWomenDC(DC); //CHANGED HERE: pass the value DC to parent class
return DC;
}
解决方案 2
将DC_Calculator_Women类中DC的访问修饰符设为protected
并且,从DC_Calculator_Men类中删除DC变量声明
现在,运行程序
在这里,我们让子类使用 Parent 类的变量。
推荐阅读
- php - 尝试在 laravel 视图中显示时解析错误
- jmeter - Jmeter XMPP消息信息
- javascript - Pug.js - 传入要从 JS 使用的 pug 文件
- python - 具有 where 条件的 Count_values 计算一列相对于另一列的值
- python - 给定数组的所有可能子数组的按位或总和
- php - PHP Exec Cron 作业返回意外的 EOF
- node.js - unable to update the array using pull in node.js
- sql-server - 在 SQLMode 中运行脚本更改变量
- android - 以编程方式覆盖supportsRtl清单属性
- javascript - 转换持续时间当我单击显示菜单的按钮时如何放置它