不能从静态上下文中引用非静态变量 x

Posted

技术标签:

【中文标题】不能从静态上下文中引用非静态变量 x【英文标题】:non-static variable x cannot be referenced from a static context 【发布时间】:2013-01-15 15:55:06 【问题描述】:

请原谅我的无知。我是初学者:

为什么下面的代码会出现以下编译错误? [line: 16]

public class average
int [] numbers = 2,3,4,5,6;
double x = averageMark(numbers);

public static double averageMark(int [] numbers)
    int sum = 0;  
    double average = 0.000;
    for (int i = 0; i < numbers.length; i++)  
      sum = numbers [i] + sum;  
      average = sum/numbers.length;  
    
    return average;
  

  public static void main (String [] args)
  System.out.println(x);
  

【问题讨论】:

System.out.println(new average().x); => 你需要一个平均值的实例。 这非常有效。请问为什么会这样? 同样在这种情况下,我访问的字段是否正确?如何访问该方法? 看这个教程:docs.oracle.com/javase/tutorial/java/javaOO/objects.html. 谢谢你,会读的。 【参考方案1】:

错误说明了一切

不能从静态上下文中引用非静态变量 x

您必须将其设为 x 静态变量。

static double x = averageMark(numbers);

或创建一个 Average 实例并访问它。

 public static void main (String [] args)
   System.out.println(new Average().x);
  

顺便说一句,你的类名应该以大写开头。

正如@mgaert 所说,您还需要将数字数组设为静态,因为您在静态方法中使用它。

static int [] numbers = 2,3,4,5,6;

【讨论】:

您还需要将数字设为静态。并且访问需要一个点。【参考方案2】:

静态方法或变量不附加到特定对象,而是附加到整个类。它们是在加载类时分配的。如果你尝试在静态方法中使用实例变量,编译器会认为,“我不知道你在说哪个对象的实例变量!” 但是如果你要创建average类的新实例,你就可以通过这个实例来访问它,所以像这样修改它:

public class average
public int [] numbers = 2,3,4,5,6;
public double x;   
public static double averageMark(int [] numbers)
    int sum = 0;  
    double average = 0.000;
    for (int i = 0; i < numbers.length; i++)  
      sum = numbers [i] + sum;  
      average = sum/numbers.length;  
    
    return average;
  

  public static void main (String [] args)
  average a = new average(); // creating new instance 'a'
  a.x = average.averageMark(a.numbers); // assigning to variable 'x' of instance 'a' result of averageMark
  System.out.println(a.x); // output a
  

【讨论】:

以上是关于不能从静态上下文中引用非静态变量 x的主要内容,如果未能解决你的问题,请参考以下文章

无法从静态上下文中引用非静态 变量 this

java ,为啥无法从静态上下文中引用非静态方法

"无法从静态上下文中引用非静态变量,非静态方法"

无法从静态上下文引用非静态方法

如何在ios framework中引用其他静态库

Java的外部类和内部类+静态变量和非静态变量的组合关系