Java 如何修复-41:无法从静态上下文引用非静态变量->这是什么原因?

Java 如何修复-41:无法从静态上下文引用非静态变量->这是什么原因?,java,static,instance-variables,primes,Java,Static,Instance Variables,Primes,我试图编写这段代码来获取第一个素数,然后使用java按顺序打印它们。它不工作有两个原因,首先我得到了错误 41:无法从静态上下文引用非静态变量ListOfPrimeNumber 当我尝试运行程序时,即使我将变量更改为static并运行程序,它也只会打印出1。因此,它只是在构造函数中迭代while循环一次,然后停止,无论我怎么努力,我都无法在那里找到问题!有谁能帮我一下吗?即使你能很快地看一眼,告诉我出了什么问题,我也非常感激 另外,与非静态和静态变量和方法相关的故事是什么?使用这些工具的最佳实践

我试图编写这段代码来获取第一个素数,然后使用java按顺序打印它们。它不工作有两个原因,首先我得到了错误

41:无法从静态上下文引用非静态变量ListOfPrimeNumber

当我尝试运行程序时,即使我将变量更改为static并运行程序,它也只会打印出1。因此,它只是在构造函数中迭代while循环一次,然后停止,无论我怎么努力,我都无法在那里找到问题!有谁能帮我一下吗?即使你能很快地看一眼,告诉我出了什么问题,我也非常感激

另外,与非静态和静态变量和方法相关的故事是什么?使用这些工具的最佳实践是什么?如果有人能把我链接到一个描述这一点的页面,我已经在谷歌上搜索了,但没有结果!我想读一读:

非常感谢大家

import java.util.*;
public class Primes {
  private ArrayList<Integer> listOfPrimeNumbers;

  public static void main(String[] args) {
    ArrayList<Integer> listOfPrimeNumbers;
    Primes generator=new Primes(50);
    print();
  }

  public Primes( int initialCapacity) {
    listOfPrimeNumbers = new ArrayList<Integer>(initialCapacity);    
    int index=0;
    int counter=0;
    while (counter != initialCapacity  ) {
      if (isPrime(index)) {
        listOfPrimeNumbers.add(index);
        counter++;
        System.out.println(counter);
        index++;
      }
      else {
        index++;
      }
    }
  }
  public boolean isPrime(int candidateNo) {
    Iterator<Integer> iter = listOfPrimeNumbers.iterator( );
    //in here ! ?
    int i=2;
    while ( iter.hasNext( ) ) {
      int next = iter.next( );
      if (next%i==0 && i!=1) {
        return false;
      }
    }
    return true;
  }

  public static void print( ) {
    int n = listOfPrimeNumbers.size();
    for(int i = 0; i <= n ; i++)
      System.out.println( listOfPrimeNumbers.get( i ) );

  }
}
我现在已经编辑了我的代码,所以一切都是静态的,这意味着我可以有多个实例?。我现在有这个,问题是它只打印出前51个数字,然后得到堆栈溢出,有人能帮忙吗?谢谢你:

import java.util.*;
public class Primes {
  private static ArrayList<Integer> listOfPrimeNumbers;

  public static void main(String[] args) {
    ArrayList<Integer> listOfPrimeNumbers;
    Primes generator=new Primes(50);
    print();
  }

  public Primes( int initialCapacity) {
    listOfPrimeNumbers = new ArrayList<Integer>(initialCapacity);    
    int index=2;
    int counter=0;
    while (counter != initialCapacity  ) {
      if (isPrime(index)) {
        listOfPrimeNumbers.add(index);
        counter++;
        System.out.println(counter);
        index++;
      }
      else {
        index++;
      }
    }
  }
  public boolean isPrime(int candidateNo) {
    Iterator<Integer> iter = listOfPrimeNumbers.iterator( );
    while ( iter.hasNext( ) ) {
      int next = iter.next( );
      if (next%candidateNo==0 && candidateNo!=1) {
        return false;
      }
    }
    return true;
  }

  public static void print( ) {
    int n = listOfPrimeNumbers.size();
    for(int i = 0; i <= n ; i++)
      System.out.println( listOfPrimeNumbers.get( i ) );

  }
}
listOfPrimeNumbers是类的成员,这意味着每个Primes实例都有自己的listOfPrimeNumbers副本

print是一个静态函数,这意味着它与素数实例无关,因此,它不能访问任何listOfPrimeNumbers变量,因为类的每个实例都有一个变量

所以listOfPrimeNumbers必须是静态的,即整个世界只有一个副本,否则打印不能是静态的。

listOfPrimeNumbers是类的成员,这意味着每个Primes实例都有自己的listOfPrimeNumbers副本

print是一个静态函数,这意味着它与素数实例无关,因此,它不能访问任何listOfPrimeNumbers变量,因为类的每个实例都有一个变量


因此,PrimeNumber列表必须是静态的,即整个世界只有一个副本,否则打印不能是静态的。

您的代码无法工作,因为您甚至没有在iPrime中使用candidateNo

至于静态事物和非静态事物的区别,非静态属于特定实例,而静态属于类


在没有首先指定您所谈论的实例之前,您不能从静态方法或其他静态上下文中引用非静态。如果我说汽车是什么颜色?您的回答可能类似于哪辆车?

您的代码不起作用,因为您甚至没有在iPrime中使用candidateNo

至于静态事物和非静态事物的区别,非静态属于特定实例,而静态属于类


在没有首先指定您所谈论的实例之前,您不能从静态方法或其他静态上下文中引用非静态。如果我说汽车是什么颜色?您的响应可能类似于哪辆车?

如果希望对函数进行实例化的非静态调用,这就是您想要的。有关其余答案,请参阅


如果希望对函数进行实例化的非静态调用,这就是您想要的。有关其余答案,请参阅


非常感谢您的回复!我不敢相信我错过了iPrime方法的愚蠢问题。我现在已经编辑了我的帖子,加入了我的新代码,但它仍然给我带来了一个问题。你能看到我做错了什么吗?你正在检查你的已知素数是否可以被你的候选人整除。你想检查你的候选人是否可以被一个已知的素数整除。顺便说一下:你可以用:for int next:listOfPrimeNumbers替换isPrime的前3行{-更短,更容易阅读。当然!谢谢!现在打印的是素数。我在if语句中切换了变量…它永远都在这样做,但它是一个明显的改进!非常感谢!:@user476033,将来你可能应该尽量避免两部分的问题。在原始答案被回答之后,它可能已经被删除了对于您遇到的下一个问题,可以发布第二个问题。一个小时后阅读这篇文章,试图辨别这篇文章的发展方式是令人困惑的。非常感谢您的回复!我不敢相信我错过了iPrime方法的愚蠢问题。我现在已经编辑了我的文章,以包含我的新代码,但它仍然给了我一个问题。你能看到我做错了什么吗?你正在检查你的已知素数是否可以被你的候选者整除。你想检查你的候选者是否可以被已知的素数整除吗
顺便说一句:您可以将iPrime的前3行替换为:for int next:listofPrimeNumber{-更短,更容易阅读。当然!谢谢!现在打印的是素数。我在if语句中切换了变量…它永远都在这样做,但它是一个明显的改进!非常感谢!:@user476033,将来你可能应该尽量避免两部分的问题。在原始答案被回答之后,它可能已经被删除了对于你遇到的下一个问题,适当地发布第二个问题。一个小时后读了这篇文章,试图辨别这篇文章的发展方式是令人困惑的。
Primes generator=new Primes(50);
generator.print();

  public void print( ) {
    int n = listOfPrimeNumbers.size();
    for(int i = 0; i <= n ; i++)
      System.out.println( listOfPrimeNumbers.get( i ) );

  }