Java:无法从静态上下文错误引用非静态变量值

Java:无法从静态上下文错误引用非静态变量值,java,static,Java,Static,我正在两个独立的类中编写一个代码,该类将一个temp作为两个独立的变量,并将其打印出来,然后运行转换方法以获得其他级别的temp。我不断得到错误,非静态变量值无法从代码的Temperature.java部分的静态上下文中引用,因为变量位于非静态的构造函数中。整个概念对我来说有点混乱,我喜欢任何关于希望静态和非静态工作的输入,以及如何在它们之间切换而不会产生问题 代码如下: public class Temperature { int value = 50; String scale =

我正在两个独立的类中编写一个代码,该类将一个temp作为两个独立的变量,并将其打印出来,然后运行转换方法以获得其他级别的temp。我不断得到错误,非静态变量值无法从代码的Temperature.java部分的静态上下文中引用,因为变量位于非静态的构造函数中。整个概念对我来说有点混乱,我喜欢任何关于希望静态和非静态工作的输入,以及如何在它们之间切换而不会产生问题

代码如下:

public class Temperature
{
  int value = 50;
  String scale = "F";

   public Temperature(int value, String scale){
    value = value;
    scale = scale;
   }

  public static void value(int value){
    int number;
  }
  public static boolean scale(String scale){
    if (scale == "C"){
      return true;
    }
    else if (scale == "F"){
      return true;
    }
    else if (scale == "K"){
      return true;
    }
    else{
      return false;
    }
  }

  public static void convertToCelsius(int value, String scale){
    if (scale == "F"){
      int newValue = (5/9) * (value - 32);
      System.out.println("The equivalent tempurature is " + newValue + "C");
    }
    else if (scale == "K"){
      double newValue = value - 273.15;
      System.out.println("The equivalent tempurature is " + newValue + "C");
    }
    else{
    }
  }

   public static void convertToFarenheit(int Value, String scale){
    if (scale == "C"){
      int newValue = ((9/5) * (value + 32));
      System.out.println("The equivalent tempurature is " + newValue + "F");
    }
    else if (scale == "K"){
      int newValue = ((9/5) * (value - 273) + 32);
      System.out.println("The equivalent tempurature is " + newValue + "F");
    }
    else{
    }
  }

    public static void convertToKelvin(int value, String scale){
    if (scale == "F"){
      int newValue = ((5/9) * (value - 32) + 273);
      System.out.println("The equivalent tempurature is " + newValue + "C");
    }
    if (scale == "C"){
      double newValue = (value + 273.15);
      System.out.println("The equivalent tempurature is " + newValue + "C");
    }
    else{
    }
  }      
  }
对于main方法,代码位于单独的类中,如下所示:

public class UsingTemperature
{
 public static void main(String[] args)
 {
  Temperature t = new Temperature(50, "F");//declaring an object
  System.out.println(t);

  // Test out conversions:
  System.out.println("Test out conversions:");
  // F to C
  t.convertToCelsius();
  System.out.println(t);

  // C to F
  t.convertToFahrenheit();
  System.out.println(t);

  // F to K
  t.convertToKelvin();
  System.out.println(t);

  // K to F
  t.convertToFahrenheit();
  System.out.println(t);

  // F to K:
  t.convertToKelvin();
  System.out.println(t);

  // K to C
  t.convertToCelsius();
  System.out.println(t);

  // C to K
  t.convertToKelvin();
  System.out.println(t); 
 }

}

t
是一个对象,但所有的
convertToScale
方法都是静态的。使用
Temperature.convertToScale(t.value,t.scale)

而且,

t.convertToCelsius();
System.out.println(t);
可能不会做你期望它做的事情。你的
convertToScale
方法没有一个是变种(它们只是打印东西),因此调用
t.convertToCelsius()
只打印出转换所做的事情,然后
System.out.println(t)
将打印默认对象.toString()(这会给你@0012378或其他东西)


另外,我刚刚注意到你所有的
(5/9)
(9/5)
,这几乎肯定会打破给定的数学,因为整数除法是如何工作的。在方法中使用Static修饰符时,这些方法将独立于为类创建的任何实例而存在。 因此,在您的课堂上,您可以使用静态方法:

  • 在创建新的温度实例之前先存在
  • 不管有多少个温度实例,静态方法只有一个副本
此外,我认为您只希望将温度作为一个实用工具,因此构造函数没有任何意义,因为构造函数仅用于创建实例


当您需要使用Temperature中的方法时:Temperature.name_method(params)

另请参见:Static指的是不创建对象就可以在类之外访问的内容。谢谢jhobbie!这是一个非常清晰和简单的表达方式,你在这个网站上搜索过吗?有许多可能的重复。可能的重复对主要方面来说是个好主意,但不幸的是不能解决另一方面的问题methods@user3889083还有什么问题?你的问题只是问‘不能指非静态…’我的意思是,即使替换它们也不能解决静态/非静态的初始问题,这实际上是一个很好的观点。有人建议我使用构造器,但如果没有构造器,可能会简化很多事情。非常感谢。