2010-11-29 7 views
1

이 코드를 작성하여 첫 번째 initialCapacity 소수를 얻은 다음 java를 사용하여 순차적으로 인쇄하려고합니다. 그것은 첫째로 나는 오류, 두 가지 이유로 작동하지 않습니다수정 방법 - 41 : 정적 컨텍스트에서 비 정적 변수를 참조 할 수 없습니다. -> 이유는 무엇입니까?

41 : 비 정적 변수 listOfPrimeNumbers은 정적 컨텍스트

내가 프로그램을 실행하려고하지만, 심지어에서 참조 할 수 없습니다 변수를 정적으로 변경하고 프로그램을 실행하면 "1"밖에 인쇄되지 않습니다. 그래서 생성자 Primes의 while 루프를 반복 한 다음 중지하고 아무리 열심히해도 문제를 찾을 수 없습니다! 누구든지 나를 빨리 도와 줄 수 있겠습니까? 아주 빨리 보일 수도 있고 잘못 될 수 있다고 말해도 정말로 감사하겠습니다.

또한 정적이 아닌 정적 변수 및 메서드와 관련된 이야기는 무엇입니까? 이들을 사용할 때 가장 좋은 방법은 무엇입니까? 누구든지이 문제를 설명하는 페이지에 링크 할 수 있다면 (나는 쓸모 없게 봤습니다!) 읽으 려구요.

정말 고마워요! 모든 정적 (I 여러 인스턴스를 가질 수 있음을 의미?)되도록

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

    } 
} 
+0

가능 중복 ([비 정적 변수 정적 콘텍스트 (자바)에서 참조 할 수 없습니다] http://stackoverflow.com/questions/2559527/non-static-variable-cannot-be-referenced- from-a-static-context-java) –

답변

5

listOfPrimeNumbersPrimes의 각 인스턴스 listOfPrimeNumbers의 복사본을 가지고 의미 클래스의 구성원입니다.

print 그것이 Primes 인스턴스에 관련되지 않는 즉, 정적 함수이며, 이와 같이,이 listOfPrimeNumbers 변수 중 하나에 액세스 할 수없는 (클래스의 인스턴스 당 하나)이있다.

따라서 listOfPrimeNumbers은 정적이어야합니다 (즉, 전체 세계에서 단 하나의 사본 만 있음). print은 정적 일 수 없습니다.

+0

완벽 ... 고맙습니다. :) – user476033

3

candidateNoisPrime에 사용하지 않았기 때문에 코드가 작동하지 않습니다.

정적 항목과 비 정적 항목의 차이점은 정적 항목이 클래스에 속하는 동안 비 정적 항목이 특정 인스턴스에 속한 것입니다.

당신이 말하는 인스턴스를 먼저 지정하지 않고 정적 메서드 (또는 다른 정적 컨텍스트) 내에서 비 ​​정적 인을 참조 할 수 없습니다. 내가 "무슨 색이 차야?"라고 말하면 좋아질 것입니다. 당신의 반응은 아마도 "어떤 차?"와 같을 것입니다.

+0

대단히 감사합니다.나는 isPrime 메서드로 어리석은 문제를 놓쳤다는 것을 믿을 수 없다. 내 새 코드를 포함하도록 게시물을 편집했지만 아직 문제가 있습니다. 내가 잘못하고있는 것을 볼 수 있니? – user476033

+1

알려진 소수가 후보자로 나눌 수 있는지 확인하고 있습니다. 후보자가 알려진 소수로 나눌 수 있는지 확인하고 싶습니다. –

+0

BTW : isPrime의 처음 3 행을 다음과 같이 바꿀 수 있습니다. for (int next : listOfPrimeNumbers) {'- 더 짧고 읽기 쉽습니다. –

0

함수에 대한 인스턴스화 된 (정적이 아닌) 호출을 원하는 경우 원하는 것입니다. 나머지 대답은 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)); 

    } 
관련 문제