Как исправить - 41: на статическую переменную нельзя ссылаться из статического контекста -> В чем причина? - PullRequest
1 голос
/ 30 ноября 2010

Я пытаюсь написать этот код, чтобы получить первые простые числа initialCapacity, а затем распечатать их в последовательности, используя Java. Это не работает по двум причинам, во-первых, я получаю ошибку

41: на нестатическую переменную listOfPrimeNumbers нельзя ссылаться из статического контекста

когда я пытаюсь запустить программу, но даже когда я изменяю переменную на статическую и запускаю программу, она выводит только «1». Так что это только итерация цикла while в конструкторе Primes один раз, а затем остановка, и я просто не могу найти проблему там, как бы я ни выглядел! Кто-нибудь сможет мне помочь, пожалуйста, даже если бы вы могли просто очень быстро взглянуть и сказать мне, что может быть не так, я был бы очень благодарен.

Кроме того, какова история с нестатическими и статическими переменными и методами? Какова лучшая практика при их использовании? Если бы кто-нибудь мог связать меня со страницей, описывающей это (я гуглил безрезультатно!), Я хотел бы прочитать:)

Спасибо всем большое!

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

  }
}

Ответы [ 3 ]

5 голосов
/ 30 ноября 2010

listOfPrimeNumbers является членом вашего класса, что означает, что каждый экземпляр Primes имеет свою собственную копию listOfPrimeNumbers.

print является статической функцией, что означает, что она не связана с экземпляром Primes, и поэтому не имеет доступа ни к одной из listOfPrimeNumbers переменных (по одной на экземпляр вашего класса).

То есть listOfPrimeNumbers должен быть статичным (т. Е. Во всем мире существует только одна копия), или print не может быть статичным.

3 голосов
/ 30 ноября 2010

Ваш код не работает, потому что вы даже не используете candidateNo в isPrime.

Что касается различия между статическими и нестатическими вещами, нестатический принадлежит определенному экземпляру, в то время как статический принадлежит классу.

Вы не можете ссылаться на нестатический статический метод (или другой статический контекст) без предварительного указания, о каком экземпляре вы говорите. Было бы как если бы я сказал "какого цвета машины?" Ваш ответ, вероятно, будет что-то вроде «какая машина?».

0 голосов
/ 30 ноября 2010

Это то, что вам нужно, если вы хотите сделать экземплярный (нестатический) вызов функции. Для остальной части ответа см. ответ EboMike .

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

  }
...