Java代码不允许使用我的变量

时间:2018-02-02 19:00:42

标签: java

当我尝试运行此代码时,它不会让我使用" bmi"。我试图制作一个简单的身体质量指数计算器,但我不明白为什么它不会起作用。如果你能正确地重写代码,它会帮助我更好地学习。

import java.util.Scanner;

public class Bmi {
    int weight;
    int height;
    int bmi = weight /(height*height) * 703;

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter weight: ");
        int weight = input.nextInt();
        System.out.print("Enter height: ");
        int height = input.nextInt();
        System.out.println(bmi);
   }

}

3 个答案:

答案 0 :(得分:4)

您正在尝试在静态上下文中使用非静态成员。

这里你真的不需要任何实例/静态变量。只需使用局部变量。

import java.util.Scanner;

public class Bmi {
public static void main(String[] args) {
     Scanner input = new Scanner(System.in);
     System.out.print("Enter weight: ");
     int weight = input.nextInt();
     System.out.print("Enter height: ");
     int height = input.nextInt();
     int bmi = weight /(height*height) * 703;
     System.out.println(bmi);
}
}

虽然在现实世界中没有发生,但当你的身高超过体重时,你会因为整数分裂而最终为零。更好的是你将它们改为双打。阅读Why is the result of 1/3 == 0?

public static void main(String[] args) {   
        Scanner input = new Scanner(System.in);
        System.out.print("Enter weight: ");
        double weight = input.nextInt();
        System.out.print("Enter height: ");
        double height = input.nextInt();
        double bmi = weight / (height * height) * 703;
        System.out.println(bmi);
    }

最后

int bmi = weight /(height*height) * 703;

该陈述不会跟踪重量和身高的值。每次更改时都需要重新评估。

答案 1 :(得分:1)

您绝不应将workeruser代码合并到同一个类中。

最好为计算器创建一个单独的类BmiCalculator,并定义一个static方法来计算bmi说calculateBmi。静态,因为它只是依赖于它需要的输入而没有别的。 然后直接在CallerClass

中调用并使用此静态方法

请参阅以下代码:

import java.util.Scanner;

class BmiCalculator {

 public static double calculateBmi(double weight, double height){
    return weight /(height*height) * 703;
 }

}

public class CallerClass{
  public static void main(String[] args) {
     Scanner input = new Scanner(System.in);
     System.out.print("Enter weight: ");
     double weight = input.nextInt();
     System.out.print("Enter height: ");
     double height = input.nextInt();
     System.out.println(BmiCalculator.calculateBmi(weight,height));
  }
}

答案 2 :(得分:0)

这是因为您尝试从静态上下文访问实例上下文。最简单的解决方法是为您添加静态修改器 字段并从bmi字段赋值中删除bmi计算,因为在加载类时会初始化所有静态。更简洁 编写此代码的方法是:

    import java.util.Scanner;

    public class Main {

        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            System.out.print("Enter weight: ");
            int weight = input.nextInt();
            System.out.print("Enter height: ");
            int height = input.nextInt();
            Bmi bmi = new Bmi(weight, height); //create new bmi instance
            System.out.println(bmi.value());   // get it's value 
            System.out.println(bmi);            // calls toString() method (object text representation) 
//that we already override in Bmi class
        }
    }

我们将Bmi计算与用户输入分离,并创建单独的类,现在Bmi类对用户输入一无所知,这很好,因为这样我们增加了内聚力并减少了Main和Bmi类中的耦合。  它有助于在不同项目中编写代码重用,并简化mantain工作。有关详细信息,请参阅https://en.wikipedia.org/wiki/GRASP_(object-oriented_design)

public class Bmi { //place to separate file with name Bmi.java
    private int weight;  
    private int height;

    public Bmi(int weight, int height) {
        this.weight = weight;
        this.height = height;
    }

    /** 
        returns a bmi value
    */
    public int value() {
        return weight / (height  * height) * 703;
    }

    public String toString() {
        return value();
    }

}