2010-08-05 18 views
7

He estado encontrando este problema muchas veces y nunca me molesté en aprender por qué sucede y aprender qué significa "estático" en realidad. Acabo de aplicar el cambio que Eclipse sugirió y siguió.¿Qué significa exactamente "estático" cuando se declaran variables "globales" en Java?

public class Member { 

// Global Variables 
int iNumVertices; 
int iNumEdges; 

public static void main(String[] args) { 

    // do stuff 

    iNumVertices = 0; // Cannot make a static reference to the non-static field iNumVertices 

    // do more stuff 

} // main end 
} 

Así Eclipse me dice que haga static int iNumVertices; y no estoy seguro de por qué. Entonces, ¿qué es exactamente "estático", cómo se usa, cuál es el propósito de usar "estático" y por qué me está dando este problema?

+4

Esas no son variables globales. Ni siquiera son públicos. Incluso si fueran públicos, no serían variables globales. Incluso si fueran públicos y estáticos, no serían variables globales. Java no tiene un concepto de global. ** Todo ** se declara localmente o en una clase o interfaz. –

+0

@Mark ... ¿Lo siento? No estaba al tanto de estos hechos. Gracias por la aclaración. Entonces, ¿cómo los clasificarías? – Hristo

+0

@Hristo: Creo que "variables miembro" es el término correcto. – torak

Respuesta

9

Aquí está tu ejemplo:

public class Member { 

    // Global Variables 
    int iNumVertices; 
    int iNumEdges; 

    public static void main(String[] args) { 

     // do stuff 

     iNumVertices = 0; // Cannot make a static reference to the non-static field iNumVertices 

    } 
} 

main El método es un método estático asociado a la clase. No está asociado con una instancia de Member, por lo que no puede acceder a las variables que están asociadas a una instancia de Member. La solución a esto es no para hacer esos campos estáticos. En su lugar, debe crear una instancia de Member utilizando la palabra clave new.

Aquí es una versión modificada:

public class Member { 
    // Fields 
    private int iNumVertices; 
    private int iNumEdges; 

    public Member(){ 
     // init the class 
    } 

    public static void main(String[] args) { 
     Member member = new Member(); 
     member.iNumVertices = 0; 
     // do more stuff 
    } 
} 

Encontrarse a sí mismos creando estática globales es una indicación de que usted debe pensar cuidadosamente acerca de cómo se está diseñando algo. No es siempre incorrecto, pero debería decirle que piense en lo que está haciendo.

+0

ohhh ... Ya veo. Eso tiene mucho sentido. ¿Por qué decidiste hacer las 2 variables globales privadas? ¿Es porque pertenecen a la clase Miembro y solo se debe acceder por los objetos miembros? – Hristo

+3

Es una práctica recomendada hacer todo privado que no necesite acceso desde el exterior, incluso en un pequeño proyecto de prueba con una sola clase. – f1sh

+2

@Hristo Creo que, en general, todas las variables de instancia (también llamadas campos, propiedades y algunos otros nombres) deben ser privadas. Desea exponer lo menos posible del funcionamiento interno de su clase. Esto te ayuda a hacer que tu clase sea más predecible porque no tendrás a alguien más que modifique el estado de tu clase. 6 meses después, cuando arregle un error en su código, no tendrá que preocuparse por otros 5 archivos que cambien sus variables si las mantiene en privado. –

1

las variables estáticas no necesitan tener la clase de una instancia con el fin de tener acceso, por lo que si usted está tratando de acceder a una variable no estática formar un contexto estático se se arriesgan a intentar acceder a algo que no se ha inicializado/instanciado.

0

variables estáticas son comunes a todas las instancias de una clase.

Nota: Como dije anteriormente estas son variables de clase, es decir, compartidas por todas las instancias.

Estas también se pueden llamar como variables de nivel de clase. Generalmente define constantes (también necesitará la palabra clave final para definir constantes) y las variables globales como estáticas.

Para obtener más información, consulte: http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html

http://www.roseindia.net/java/beginners/staticvariable.shtml

0

Cada variable de clase (una variable declarada dentro del cuerpo de la clase y fuera de los cuerpos de los métodos) usado en un método estático necesita ser declarado estática también.

Se puede acceder a variables y métodos de clase estáticos fuera de esa clase sin la necesidad de una instancia de esa clase.

1

Los métodos estáticos solo pueden acceder a las variables estáticas. Hay dos tipos de variables en clase. uno son variables estáticas (también variables de clase) y otro es variable de instancia. Solo existe una copia de la variable estática en la memoria, pero las variables de instancia se instanciarán para cada objeto. Entonces, para las variables estáticas todos los objetos tienen acceso a la misma variable y cualquier cambio hecho por un objeto se reflejará en otros objetos. La pregunta aquí es por qué los métodos deben ser estáticos para acceder a las variables estáticas. Cuando hace que un método sea estático, puede acceder al método sin crear instancias de objetos de esa clase. Entonces, si este método puede acceder a variables de instancia, ¿para qué variables del objeto debería cambiarse? La otra forma es posible, es decir, los métodos no estáticos pueden acceder a las variables estáticas.

+0

Entonces, si quiero que una variable sea específica para cada objeto ... si quiero que cada miembro sea independiente de otro miembro (por ejemplo, si son de diferentes edades), entonces no debería estar usando estática ¿verdad? – Hristo

+1

@Hristo correcto. El término "instancia" se refiere a una realización única e individual de la clase. La clase describe cómo se debe estructurar cada instancia. Las estadísticas evitan eso y no son realmente parte de las instancias individuales. No pueden ser exclusivos de una instancia; solo hay una copia de una estática, no una asociada a cada instancia. –

+0

Gracias por la explicación. Eso tiene sentido. – Hristo

4

estáticas variables son aquellas que se comparten en todos los objetos de una clase. Aquí en su ejemplo para cada objeto de Miembro que crea, obtendrá objetos que tienen sus propios valores iNumVertices. Cuando utiliza estática con una variable, solo hay una variable compartida en cada objeto de Miembro. Los métodos estáticos funcionan de la misma manera: se comparten en todos los objetos.

Dado que variables estáticas son comunes a todos los objetos, no es necesario hacer un objeto de la clase para acceder a estas variables/métodos.

Variables no estáticas como iNumVertices pertenecen a un objeto de la clase. No se puede acceder sin crear un objeto. Por lo tanto, cuando accede a una variable no estática desde un contexto estático (aquí método principal), entonces java no sabría qué objeto es iNumVertices al que está intentando acceder. De ahí el error.

O haced iNumVertices estática, o hacer referencia a ella mediante la creación de un objeto de miembro

Member m = new Member(); 
m.iNumVertices = 0; 
+0

Entonces, si quiero que una variable sea específica para cada objeto ... si quiero que cada miembro sea independiente de otro miembro (por ejemplo, si son de diferentes edades), entonces no debería usar estática ¿verdad? – Hristo

+0

¡Exactamente! Ese es el propósito exacto de las variables miembro. No debe, sin embargo, confundirlo con el alcance de una variable: pública, privada, etc. – Ara

+0

esperar ... Pensé que el alcance se refería al intervalo de tiempo en el que vive una variable. ¿Estás diciendo que público, privado, etc. también define el alcance? – Hristo

4
learn what "static" actually means 

Lo estática en realidad significa que la variable de clase será el mismo para todas las instancias de esa clase en particular, sin embargo si desea evitar el uso de variables estáticas (lo cual es una buena idea, ya que las variables estáticas se mantienen en la memoria) puede pasar el valor variable a través del constructor evitando así el uso del modificador estático y lograr el mismo efecto (es decir, si pasa el mismo valor en instanciación de clase).

Aquí es ejemplo de código:

public class Car{ 

    private int speed; 

    public Car(int speed){ 
     this.speed = speed; 
    } 

} 

Así que usted puede hacer esto al crear nueva instancia:

Car car = new Car(100); 

y cada vez que se crea instancia de coches tendrá velocidad de 100, evitando así la declaración estática private static int speed = 100;

+0

ahh eso es interesante ... solución ligeramente diferente de las otras respuestas. ¿Te importa publicar un código para demostrar? – Hristo

+0

@Hristo He añadido un código –

+0

Gracias por el código. – Hristo

Cuestiones relacionadas