2012-04-17 29 views
5

He estado experimentando y descubrí que cuando ejecuto el código continuo, no se compila y no puedo entender por qué.Java: hacer una referencia estática a la lista de campos no estáticos

Mi IDE dice 'No puedo hacer una referencia estática a la lista de campos no estáticos', pero realmente no entiendo qué ni por qué es esto. También lo demás se aplica a, es decir: se trata sólo de las variables y métodos privados o demasiado y por qué ?:

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

} 

Sin embargo, cuando lo cambio a la siguiente, que hace el trabajo:

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

El método principal es estático. Solo tiene acceso a las variables miembro estáticas y funciones de la clase adjunta. El error es bastante autoexplicativo. – Perception

+0

Desde su código, parece que está intentando crear una fábrica de singleton. Si ese es su objetivo, debe cambiar 'lista de lista privada; 'a' lista de lista estática privada; ' –

+0

@Perception: Entonces, si cambia la' lista de lista privada; 'a' lista de lista privada estática; 'en el primer código, debería funcionar ??? – noMAD

Respuesta

4

campos estáticos son campos que se comparten en todas las instancias de la clase.
campos no estáticos/miembros son específicos de una instancia de la clase.

Ejemplo:

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

Aquí tiene sentido que cualquier coche dado puede tener cualquier número de neumáticos, pero el número máximo es el mismo en todos los coches.
Si modificamos la variable tireMax, modificar el valor significaría que todos los automóviles ahora pueden tener más (o menos) neumáticos.

El motivo por el que funciona su segundo ejemplo es que está recuperando el list de una nueva instancia de MyList. En el primer caso, se encuentra en el contexto estático y no en el contexto de una instancia específica, por lo que no se puede acceder a la variable list.

+0

debe ser 'final' no de solo lectura – Lucas

0

En el primer ejemplo, llama al campo no estático desde el contenido estático, lo cual no es posible. En el segundo, está llamando a la función ext en el objeto MyList, que tiene acceso a ese campo.

Cuestiones relacionadas