创建类的实例时,静态上下文无法引用非静态变量“this”。

4
当我尝试将Edge类的新实例(子类?)添加到我的ArrayList中时,出现了“非静态变量this无法从静态上下文引用”的错误。我无法弄清楚自己做错了什么!
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中。 - Hovercraft Full Of Eels
可能是重复的问题:非静态变量不能从静态上下文中引用(Java) - user207421
2个回答

11
你需要将嵌套类 Edge 改为 static:
public static class Edge {
    ...
}

否则,嵌套类仍然是非静态的,这意味着它保留对其外部类实例的引用。因此,只有在您可以访问外部类实例的实例方法或其他地方才能实例化内部类。
一般来说,公共静态类是顶级类的良好选择。例外情况是当它们与其外部类相关联到使它们在其上下文之外没有意义时。例如,Map.Entry 在其外部 Map 接口之外没有意义。

3
最好将其放在自己的文件中。 - Hovercraft Full Of Eels

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

这个错误表示您正在访问未使用其对象的静态变量。要访问非静态变量,您需要该类型的对象。只有静态变量可以在没有任何对象的情况下访问。

解决方案与@dasblinkenlight提供的相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接