Para ser específico, estaba intentando este código:
package hello;
public class Hello {
Clock clock = new Clock();
public static void main(String args[]) {
clock.sayTime();
}
}
Pero dio el error
No se puede acceder al campo no estático en el método principal estático
Así que cambié la declaración de clock
a esto:
static Clock clock = new Clock();
Y funcionó. ¿Qué significa poner esa palabra clave antes de la declaración? ¿Qué hará exactamente y / o restringirá en términos de lo que se puede hacer a ese objeto?
java
static
oop
language-features
restriction
Haga clic en Upvote
fuente
fuente
Respuestas:
static
los miembros pertenecen a la clase en lugar de una instancia específica.Significa que solo
static
existe una instancia de un campo [1] incluso si crea un millón de instancias de la clase o no crea ninguna. Será compartido por todas las instancias.Dado que los
static
métodos tampoco pertenecen a una instancia específica, no pueden referirse a miembros de la instancia. En el ejemplo dado,main
no sabe a qué instancia de laHello
clase (y, por lo tanto, a qué instancia de laClock
clase) debería referirse.static
los miembros solo pueden referirse a losstatic
miembros. Los miembros de la instancia pueden, por supuesto, acceder a losstatic
miembros.Nota al margen: Por supuesto, los
static
miembros pueden acceder a los miembros de la instancia a través de una referencia de objeto .Ejemplo:
[1]: Dependiendo de las características de tiempo de ejecución, puede ser uno por ClassLoader o AppDomain o hilo, pero eso no viene al caso.
fuente
Significa que solo hay una instancia de "reloj" en Hello, no una por cada instancia separada de la clase "Hello", o más, significa que habrá una referencia de "reloj" comúnmente compartida entre todas las instancias de la clase "Hola".
Entonces, si tuviera que hacer un "nuevo Hola" en cualquier parte de su código: A- en el primer escenario (antes del cambio, sin usar "estático"), generaría un nuevo reloj cada vez que se llama un "nuevo Hola", pero B- en el segundo escenario (después del cambio, usando "estático"), cada instancia de "nuevo Hola" aún compartiría y usaría la referencia inicial y la misma "reloj" creada por primera vez.
A menos que necesite "reloj" en algún lugar fuera de main, esto funcionaría igual de bien:
fuente
main()
rutina debe ser autónoma.main
método porque el OP lo hizo. Si, en cambio, se trataba de un método público al que se llamó desde otro lugar, y la clase Hello se instanciaba más de una vez, podría crear una instancia de Clock para cada instancia de Hello, a menos queclock
fuera estática.La
static
palabra clave significa que algo (un campo, método o clase anidada) está relacionado con el tipo en lugar de cualquier instancia particular del tipo. Entonces, por ejemplo, uno llamaMath.sin(...)
sin ninguna instancia de laMath
clase, y de hecho no puede crear una instancia de laMath
clase.Para obtener más información, consulte el fragmento relevante del Tutorial Java de Oracle .
Nota al margen
Desafortunadamente, Java le permite acceder a miembros estáticos como si fueran miembros de instancias, p. Ej.
Eso hace que parezca como si
sleep
es un método de instancia, pero en realidad es un método estático - que siempre hace que el sueño hilo actual. Es mejor dejar esto claro en el código de llamada:fuente
System.out
no me gusta un nombre de tipo.La
static
palabra clave en Java significa que la variable o función se comparte entre todas las instancias de esa clase, ya que pertenece al tipo , no a los objetos en sí.Entonces, si tiene una variable:
private static int i = 0;
y la incrementa (i++
) en una instancia, el cambio se reflejará en todas las instancias.i
ahora será 1 en todos los casos.Los métodos estáticos se pueden usar sin crear instancias de un objeto.
fuente
Uso básico de miembros estáticos ...
Así es como puede tener valores compartidos en todos los miembros de la clase sin enviar la instancia de clase Hello a otra clase. Y con estática no necesita crear una instancia de clase.
Simplemente puede llamar a valores o métodos estáticos por nombre de clase:
fuente
Estático significa que no tiene que crear una instancia de la clase para usar los métodos o variables asociados con la clase. En su ejemplo, puede llamar a:
directamente, en lugar de:
Desde el interior de un método estático (que pertenece a una clase) no puede acceder a ningún miembro que no sea estático, ya que sus valores dependen de su instanciación de la clase. Un objeto Clock no estático, que es un miembro de instancia, tendría un valor / referencia diferente para cada instancia de su clase Hello y, por lo tanto, no podría acceder a él desde la parte estática de la clase.
fuente
Estático en Java:
Static es un modificador sin acceso. La palabra clave estática pertenece a la clase que instancia de la clase. se puede usar para adjuntar una Variable o Método a una Clase.
La palabra clave estática PUEDE usarse con:
Método
Variable
Clase anidada dentro de otra clase
Bloque de inicialización
NO PUEDE ser usado con:
Clase (no anidada)
Constructor
Interfaces
Método Clase interna local (diferencia luego clase anidada)
Métodos de clase interna
Variables de instancia
Variables locales
Ejemplo:
Imagine el siguiente ejemplo que tiene una variable de instancia llamada count que se incrementa en el constructor:
Salida:
Dado que la variable de instancia obtiene la memoria en el momento de la creación del objeto, cada objeto tendrá la copia de la variable de instancia, si se incrementa, no se reflejará en otros objetos.
Ahora, si cambiamos el recuento de variables de instancia a uno estático , el programa producirá resultados diferentes:
Salida:
En este caso, la variable estática obtendrá la memoria solo una vez, si algún objeto cambia el valor de la variable estática, retendrá su valor.
Estática con final:
La variable global que se declara como final y estática permanece sin cambios durante toda la ejecución. Porque, los miembros estáticos se almacenan en la memoria de la clase y se cargan solo una vez en toda la ejecución. Son comunes a todos los objetos de la clase. Si declara variables estáticas como finales, cualquiera de los objetos no puede cambiar su valor ya que es final. Por lo tanto, las variables declaradas como finales y estáticas a veces se denominan constantes. Todos los campos de las interfaces se denominan constantes, ya que son finales y estáticos por defecto.
Recurso de imagen: estática final
fuente
Para agregar a las respuestas existentes, déjame probar con una imagen:
Se aplica una tasa de interés del 2% a TODAS las cuentas de ahorro. Por lo tanto, es estático .
Un equilibrio debe ser individual , por lo que no es estático.
fuente
Esta discusión ha ignorado hasta ahora las consideraciones del cargador de clases. Estrictamente hablando, los campos estáticos de Java se comparten entre todas las instancias de una clase para un cargador de clases dado .
fuente
Se puede asignar un campo a la clase o a una instancia de una clase. Por defecto, los campos son variables de instancia. Al usar
static
el campo se convierte en una variable de clase, por lo tanto, hay uno y solo unoclock
. Si realiza cambios en un lugar, es visible en todas partes. Los valores de instancia se cambian independientemente uno del otro.fuente
La palabra clave
static
se usa para denotar un campo o un método como perteneciente a la clase misma y no a la instancia. Usando su código, si el objetoClock
es estático, todas las instancias de laHello
clase compartirán esteClock
miembro de datos (campo) en común. Si lo hace no estático, cada instancia individual deHello
puede tener unClock
campo único .El problema es que agregó un método principal a su clase
Hello
para poder ejecutar el código. El problema aquí es que el método principal es estático y, como tal, no puede hacer referencia a campos o métodos no estáticos dentro de él. Puede resolver esto de dos maneras:Hello
clase sean estáticos para que se puedan hacer referencia a ellos dentro del método principal . Esto realmente no es algo bueno (o la razón incorrecta para hacer que un campo y / o método sea estático)Hello
clase dentro del método principal y acceda a todos sus campos y métodos de la manera en que estaban destinados en primer lugar.Para usted, esto significa el siguiente cambio en su código:
fuente
En Java, la
static
palabra clave puede considerarse simplemente que indica lo siguiente:Si piensa de
static
esta manera, se vuelve más fácil comprender su uso en los diversos contextos en los que se encuentra:Un
static
campo es un campo que pertenece a la clase en lugar de a cualquier instancia en particular.Un
static
método es un método que no tiene noción dethis
; se define en la clase y no conoce ninguna instancia particular de esa clase a menos que se le pase una referenciaUna
static
clase miembro es una clase anidada sin ninguna noción o conocimiento de una instancia de su clase adjunta (a menos que se le pase una referencia a una instancia de clase adjunta)fuente
Estático hace que el miembro del reloj sea un miembro de la clase en lugar de un miembro de la instancia. Sin la palabra clave estática, necesitaría crear una instancia de la clase Hello (que tiene una variable de miembro de reloj), p. Ej.
fuente
los métodos estáticos no utilizan ninguna variable de instancia de la clase en la que están definidos. En esta página puede encontrar una muy buena explicación de la diferencia .
fuente
He desarrollado un gusto por los métodos estáticos (solo, si es posible) en las clases "auxiliares".
La clase que llama no necesita crear otra variable miembro (instancia) de la clase auxiliar. Simplemente llama a los métodos de la clase auxiliar. También se mejora la clase auxiliar porque ya no necesita un constructor y no necesita variables miembro (instancia).
Probablemente hay otras ventajas.
fuente
fuente
También se puede pensar en miembros estáticos que no tienen un puntero "this". Se comparten entre todas las instancias.
fuente
Comprender conceptos estáticos
Segunda clase
fuente
main()
es un método estático que tiene dos restricciones fundamentales:this()
ysuper()
no se puede usar en contexto estático.fuente
Solo se puede acceder a las variables estáticas solo con métodos estáticos, por lo que cuando declaramos las variables estáticas, los métodos getter y setter serán métodos estáticos.
métodos estáticos es un nivel de clase al que podemos acceder usando el nombre de la clase
El siguiente es un ejemplo de getters y setters de variables estáticas:
fuente
Aquí se formuló una pregunta sobre la elección de la palabra 'estática' para este concepto. Se duplicó con esta pregunta, pero no creo que la etimología se haya abordado claramente. Entonces...
Se debe a la reutilización de palabras clave, comenzando con C.
Considere las declaraciones de datos en C (dentro del cuerpo de una función):
La variable foo se crea en la pila cuando se ingresa la función (y se destruye cuando la función termina). Por el contrario, la barra siempre está ahí, por lo que es 'estática' en el sentido del inglés común: no va a ninguna parte.
Java y lenguajes similares tienen el mismo concepto para los datos. Los datos pueden asignarse por instancia de la clase (por objeto) o una vez para toda la clase. Dado que Java pretende tener una sintaxis familiar para los programadores de C / C ++, la palabra clave 'estática' es apropiada aquí.
Por último, llegamos a los métodos.
Conceptualmente hablando, hay una instancia de foo () para cada instancia de la clase C. Solo hay una instancia de bar () para toda la clase C. Esto es paralelo al caso que discutimos para los datos, y por lo tanto usando 'static 'nuevamente es una opción sensata, especialmente si no desea agregar más palabras clave reservadas a su idioma.
fuente