4

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;
        }
    }
}
4

2 に答える 2

10

Edgeネストされたクラスを作成する必要がありますstatic

public static class Edge {
    ...
}

それ以外の場合、ネストされたクラスは非静的のままです。つまり、外部クラスのインスタンスへの参照を保持します。結果として、外部クラスのインスタンスにアクセスできるインスタンスメソッドまたは他の場所のみが内部クラスをインスタンス化できます。

一般に、パブリック静的クラスはトップレベルクラスの適切な候補です。例外は、それらがそのコンテキストの外では意味をなさない範囲でそれらの外部クラスに結び付けられている場合です。たとえば、外部インターフェイスMap.Entryの外側では意味がありません。Map

于 2013-02-08T18:42:34.880 に答える
0
non-static variable this cannot be referenced from a static context"

このエラーは、オブジェクトなしでは静的ではない変数にアクセスしていることを示しています。非静的変数にアクセスするには、そのタイプのオブジェクトが必要です。オブジェクトなしでアクセスできるのは静的変数のみです。

解決策は、提供されている@dasblinkenlightと同じです。

于 2013-02-08T18:46:33.153 に答える