2010-03-23 3 views
2

이전에 익명의 내부 클래스가 "외부"클래스의 필드를 보지 못했을 때 문제가있었습니다. 내부 클래스에 표시되도록 최종 변수를 만들어야했습니다. 이제 나는 정반대의 상황에 처해있다. "외부"클래스 "ClientListener"에서는 "내부"클래스 "스레드"와 "스레드"클래스를 사용하고 "실행"메서드를 사용하고 "외부"클래스에서 "earPort"를 봅니다! 왜?내 내부 클래스에 정적 변수 NON이 표시되는 이유는 무엇입니까?

import java.io.IOException; 
import java.net.*; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 

public class ClientsListener { 

    private int earPort; 

    // Constructor. 
    public ClientsListener(int earPort) { 
     this.earPort = earPort; 
    } 

    public void starListening() { 

     Thread inputStreamsGenerator = new Thread() { 
      public void run() { 
       System.out.println(earPort); 
       try { 
        System.out.println(earPort); 
        ServerSocket listeningSocket = new ServerSocket(earPort); 
        Socket serverSideSocket = listeningSocket.accept(); 
        BufferedReader in = new BufferedReader(new InputStreamReader(serverSideSocket.getInputStream())); 
       } catch (IOException e) { 
        System.out.println(""); 
       } 
      } 
     }; 
     inputStreamsGenerator.start();  
    } 

} 
+1

합니다. – CiscoIPPhone

답변

12

익명의 내부 클래스는 정적 변수와 인스턴스 변수에 액세스 할 수 있습니다. 로컬 변수에도 액세스하려면 최종 변수로 선언하십시오. 이것이 작동하는 방법입니다.

1

익명 내부 클래스는 포함하는 개체의 특성에 액세스 할 수 있습니다. static으로 선언되지 않은 모든 내부 클래스에는 암시 적 접근자가 있습니다. 당신이 발생하지 않도록하려면

, 당신은 정적 내부 클래스를 선언하고 인스턴스화 할 수 있습니다 : 나는 자바의 기능을 같이 할

public class ClientsListener { 

    private int earPort; 

    // Constructor. 
    public ClientsListener(int earPort) { 
     this.earPort = earPort; 
    } 

    public void starListening() { 

     Thread inputStreamsGenerator = new InputStreamsGenerator(); 
     inputStreamsGenerator.start();  
    } 

    private static class InputStreamsGenerator extends Thread() { 
     public void run() { 
      // no access to earport in next line (can make it a constructor argument) 
      System.out.println(earPort); 
      try { 
       System.out.println(earPort); 
       ServerSocket listeningSocket = new ServerSocket(earPort); 
       Socket serverSideSocket = listeningSocket.accept(); 
       BufferedReader in = new BufferedReader(new InputStreamReader(serverSideSocket.getInputStream())); 
      } catch (IOException e) { 
       System.out.println(""); 
      } 
     } 
    }; 
} 
관련 문제