2013-02-08 2 views
3

저는 새 인스턴스를 추가하려고하면 "정적 컨텍스트에서 참조 할 수없는 비 정적 변수"오류를 얻습니다. Edge 클래스 (하위 클래스?)를 내 arraylist에게 보냅니다. 내가 뭘 잘못하고 있는지 알아낼 수 없어!비 정적 변수이 클래스의 인스턴스를 만들 때 정적 컨텍스트에서 참조 할 수 없습니다.

public static class Edge { 
    ... 
} 

그렇지 않으면, 중첩 된 클래스는 그것의 외부 클래스의 인스턴스에 대한 참조를 유지 즉, 비 정적으로 유지 :

public class stuff{ 

    public static void main(String[] args){ 

     ArrayList<Edge> edges = new ArrayList<Edge>(); 
     edges.add(new Edge(1,2, 3, 4)); 
    } 

    public class Edge{ 

     private int x1; 
     private int y1; 
     private int x2; 
     private int y2; 
     private double distance; 
     private boolean marked; 

     //constructors  
     public Edge(int point1_x, int point1_y, int point2_x, int point2_y){ 
      x1 = point1_x; 
      y1 = point1_y; 
      x2 = point2_x; 
      y2 = point2_y; 

      int x_dist = x1 - x2; 
      int y_dist = y1 - y2; 
      distance = Math.hypot((double)x_dist, (double)y_dist); 

      marked = false; 
     } 

     //methods 
     public void mark(){ 
      marked = true; 
     } 
     public boolean isMarked(){ 
      return marked; 
     } 
     public double weight(){ 
      return distance; 
     } 
    } 
} 
+2

Edge 클래스는 자체 파일 인 Edge.java에 있어야합니다. –

+0

[정적이 아닌 변수는 정적 컨텍스트 (Java)에서 참조 할 수 없습니다] (http://stackoverflow.com/questions/2559527/non-static-variable-cannot-be-referenced-from-a-static -context-java) – EJP

답변

9

당신은 Edge 중첩 클래스 static를 확인해야합니다. 따라서 인스턴스 메서드 또는 외부 클래스의 인스턴스에 대한 액세스 권한이있는 다른 위치에서만 내부 클래스를 인스턴스화 할 수 있습니다.

일반적으로 public static 클래스는 최상위 클래스에 적합한 후보입니다. 예외는 외부 클래스에 묶여 문맥 밖에서 의미가 없다는 것을 의미합니다. 예를 들어, Map.Entry은 바깥 쪽 Map 인터페이스 외부에서 의미가 없습니다.

+3

자체 파일에 저장하는 것이 더 좋습니다. –

+0

위대한 설명, 도움을 주셔서 감사합니다. – thrown

+0

@HovercraftFullOfEels 좋은 제안입니다. 정말 고마워요! – dasblinkenlight

0
non-static variable this cannot be referenced from a static context" 

이 오류는 해당 개체없이 정적이 아닌 변수에 액세스하고 있음을 나타냅니다. 정적 변수가 아닌 변수에 액세스하려면 해당 유형의 객체가 필요합니다. 정적 변수들만 어떤 객체없이 액세스 될 수 있습니다.

제공된 솔루션은 @dasblinkenlight와 동일합니다.

관련 문제