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