2012-04-17 54 views
5

我刚刚进行了试验,发现当我运行滚动代码时,它不能编译,我找不到原因。Java - 对静态字段列表进行静态引用

我的IDE说“无法对非静态字段列表进行静态引用”,但我不太明白这是什么或为什么。此外还有什么它适用于,即:它只是私有变量和方法,或者过于为什么?:

public class MyList { 

    private List list; 

    public static void main (String[] args) { 
     list = new LinkedList(); 
     list.add("One"); 
     list.add("Two"); 
     System.out.println(list); 
    } 

} 

然而,当我将其更改为以下,它的工作:

public class MyList { 

    private List list; 

    public static void main (String[] args) { 
     new MyList().exct(); 
    } 

    public void exct() { 
     list = new LinkedList(); 
     list.add("One"); 
     list.add("Two"); 
     System.out.println(list); 
    } 

} 
+2

主要方法是静态的。它只能访问静态成员变量和封闭类的函数。这个错误非常明显。 – Perception 2012-04-17 23:43:11

+0

从你的代码看起来你正在试图创建一个单身工厂。如果这是你的目标,你应该改变'私人列表清单; '到'私人静态列表列表;' – 2012-04-17 23:45:02

+0

@Perception:所以如果他改变'私人列表列表;'到'私人静态列表列表;'在第一个代码,它应该工作? – noMAD 2012-04-17 23:45:15

回答

4

静态字段是在类的所有实例之间共享的字段。
非静态/成员字段特定于该类的一个实例。

例子:

public class Car { 
    static final int tireMax = 4; 
    int tires; 
} 

这是有道理的,任何给定的车可以有任意数量的轮胎,但最大数量是所有汽车一样。
如果我们使tireMax变化可变,修改该值意味着所有的汽车现在可以有更多(或更少)的轮胎。

你的第二个例子工作的原因是你正在检索新的MyList实例的list。在第一种情况下,您处于静态上下文中,而不是在特定实例的上下文中,因此变量list不可访问。

+0

应该不是只读的 – Lucas 2012-04-18 00:05:50

0

在第一个示例中,您从静态内容调用非静态字段,这是不可能的。 在第二个中,您正在MyList对象上调用ext函数,该对象可以访问该字段。