2013-03-22 5 views
3

저는 정적 대 비 정적의 개념에 어려움을 겪고 있습니다. 나는이 스레드 예제 프로그램 (here originally에서 수정)를 공부하고, 나는 내부 클래스를 사용할 때 오류 얻을 것이다 : 그러나내부 클래스가있는 경우에만 "정적 컨텍스트에서 참조 할 수없는 비 정적 변수"오류가 발생합니다.

public class Main2 { 
    public static void main(String[] args) { 
     Thread simple = new Thread(new SimpleTask()); 
     simple.start(); 
    } 


    class SimpleTask implements Runnable { 
     public void run() { 

     } 

     ; 
    } 

    class DaemonTask implements Runnable { 
     public void run() { 
      int i = 0; 
     } 
    } 

} 

: 여기

Error: non-static variable this cannot be referenced from a static context 

하면 오류가 발생 코드 이 3 개 클래스이다 그래서 나는 그것을 깰 때, 오류가 없습니다 .. 즉 내가 할 경우 :

public class Main2 { 
    /* contents */ 
} 

class SimpleTask implements Runnable { 
    /* contents */ 
} 

class DaemonTask implements Runnable { 
    /* contents */ 
} 

그런 다음 그것을 잘 컴파일합니다. 우리가 다른 반으로 나누는 것이 왜 중요합니까?

답변

4

내부 클래스 인스턴스 (SimpleTask)에 액세스하려면 외부 클래스 인스턴스 (Main2)가 필요합니다.

이 시도 :

Thread simple = new Thread(new Main2().new SimpleTask()); 

확인 내부 클래스를 Oracle trails

+1

와우는 이런 식으로 발전했습니다. 작동합니다! 고맙습니다!!!!!! – Coffee

+1

당신은 오신 것을 환영합니다. 문제가 해결되면 여기에서 답변 중 하나를 받아 들여야합니다. – PermGenError

+0

시간을 절약했습니다. 감사합니다 !!!!!! –

3

클래스가 이기 때문에 내부 클래스입니다. 암묵적으로 외부 클래스의 해당 인스턴스가 필요합니다.

내부 클래스를 static으로 선언하면 문제가 해결됩니다.

+0

이 작품은 - 감사합니다 !! 나는'암묵적으로 외부 클래스의 상응하는 인스턴스가 필요합니다 .' 고 공부할 필요가 있습니다. 감사합니다! – Coffee

1

SimpleTaskDemonTask 클래스는 정적이어야한다


Instance members 정적에서 직접 인스턴스 멤버를 사용할 수 있도록 class.And의 특정 객체과 관련된 (귀하의 경우 SimpleTaskDemonTask에서) 메서드 (정적 멤버는 인스턴스 자체를 매개 변수로 전달하지 않는 한 클래스의 인스턴스에 대한 정보가 없으므로)

Main2 액세스 SimpleTaskDemonTask 그것은 new Main2().new SimpleTask()

또는

정적이 두 클래스

+0

감사합니다 !!!!!! – Coffee

1

시도를하고 class SimpleTask implements Runnable 정적 확인을 통해.

클래스를 선언하면 인스턴스 별 클래스 정의가 다소 선언됩니다. 더 정확히 말하면 SimpleTask의 클래스 정의를 Main2으로 묶는 것입니다.

Main2 obj = new Main2(); 
SimpleTask t = obj.new SimpleTask(); 

공지 사항 obj.new의 사용 : 당신이 할 것 해당 클래스의 객체를 생성하기 위해

. 당신이 당신의 외부 교실 안쪽에서 그것을 부를 때, 당신은 정말로 this.new라고 부릅니다. 정적 메서드는 this에 대한 지식이 없으므로 오류가 발생합니다.

+0

아 좋아, 그 전에 정적을 추가하기 만하면 돼. 고마워! – Coffee

+1

나중에 참조 할 수 있도록 더 나은 설명이 나와 있습니다. http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class –

1

문제에 라인에있다 "(새 SimpleTask()) 간단한 = 새 스레드를 스레드;" SimpleTask 클래스는 중첩 클래스로 정의되므로 하나를 만들려면 외부 클래스의 객체가 필요합니다. 생성자는 포함 된 클래스에 대한 암시 적 참조가 필요합니다. 일반적인 메소드가 현재 클래스 인스턴스에 대한 암시 적 참조를 얻는 방법과 유사합니다. '이'). 여기서 기본적으로 묻는 것은 "Thread simple = new Thread (null.new SimpleTask());"입니다. 예외를 발생시키는 것은이 'null'입니다.