【问题标题】:How to fix - 41: non-static variable cannot be referenced from a static context -> What is the reason for this?如何修复 - 41:无法从静态上下文引用非静态变量 -> 这是什么原因?
【发布时间】:2011-05-17 13:43:48
【问题描述】:

我正在尝试编写此代码来获取第一个 initialCapacity 素数,然后使用 java.xml 依次打印它们。它不起作用有两个原因,首先我收到错误

41: 不能从静态上下文引用非静态变量 listOfPrimeNumbers

当我尝试运行程序时,即使我将变量更改为静态并运行程序,它也只会打印出“1”。所以它只是在构造函数 Primes 中迭代 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 ) );

  }
}

【问题讨论】:

标签: java static instance-variables primes


【解决方案1】:

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

print 是一个静态函数,这意味着它与Primes 的实例无关,因此它无法访问任何listOfPrimeNumbers 变量(每个实例一个你的班级)。

所以listOfPrimeNumbers 必须是静态的(即整个世界中只有一个副本),或者print 不能是静态的。

【讨论】:

    【解决方案2】:

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

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

    如果不首先指定您正在谈论的实例,您不能从静态方法(或其他静态上下文)中引用非静态。就像我说“汽车是什么颜色的?”您的回答可能是“哪辆车?”。

    【讨论】:

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

    如果您希望对函数进行实例化(非静态)调用,这就是您想要的。其余答案请见EboMike's answer

    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 ) );
    
      }
    

    【讨论】:

      猜你喜欢
      • 2010-09-22
      • 2022-12-12
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多