Métodos y Variables Estáticas en Java: Uso y Acceso
Resumen
Los métodos y variables estáticos nos ayudan a ejecutar o conseguir algún código desde clases no han sido instanciadas, ya que sus valores se guardan en la memoria de nuestro programa, no en diferentes objetos instanciados a través de una clase.
Las variables estáticas mantienen su valor durante todo el ciclo de vida de nuestro programa, por lo tanto, podemos alterar los valores de una variable estática desde una clase y consumir su valor alterado desde otra sin necesidad de conectar ambas clases.
También podemos importar los métodos estáticos de una clase para usarlos sin necesidad de escribir el nombre de la clase:
importstaticcom.anncode.operaciones.Calculadora.*
importstaticjava.lang.Math.*
publicclassPrincipal{publicstaticvoid(String[] args){int number =suma(3,5);System.out.println(number + PI);}}
Las variables static no pertenecen al objeto si no a la clase, si se modifica la variable static esto se verá reflejado en todos los objetos que hayan sido creados con esa clase.
Un ejemplo en donde usar static podría ser en un ID eje:
publicclassDoctor{//Atributosstatic int ID=0; int id;Doctor(){ id =ID;ID++;}public int getId(){return id;}}
Doctor d1 =newDoctor();Doctor d2 =newDoctor();Doctor d3 =newDoctor();System.out.println(d1.getId()+" "+ d2.getId()+" "+d3.getId());//imprimirá 0,1,2//y cada vez que creemos un nuevo Doctor lo va a incrementar
Este aporte esta muy bueno gracias amigo
Te voy a hacer algunas recomendaciones:
No usar la misma palabra para identificar a dos variables que tienen diferente propósito (ID vs id) ... en su lugar podrías usar id para la instancia y globalId (global ID) para llevar el registro del último ID creado.
No usar variables full uppercase (caso ID). Por convención las uppercase son CONSTANTES`
¿Que es Static? se utiliza para definir métodos o variables de ese tipo estático. Utilizamos Static para llamar una variable sin utilizar un objeto. Se invoca en una clase que no tiene instancias de la clase.
¿Que nivel de Scope tiene una variable de tipo Static? Una variable de ese tipo, mantiene su ciclo de vida en todo el programa mientras este corriendo el programa.
Excelente aporte!
Genial! me ayudaste a comprenderlo del todo.
Un problema común es que cuando se usa static en un método y al mismo tiempo se quiere manipular una variable, esa misma debe ser static sino saldrá error.
Que locuraaa, que buen aporte, aca una explicación de CHAT GPT.
¿Por qué ocurre esto?
Contexto de Clase vs. Contexto de Instancia:
Un método static se ejecuta en el contexto de la clase, no en el contexto de una instancia específica de la clase.
Las variables y métodos que no son static (es decir, los de instancia) pertenecen a instancias específicas de la clase. Para acceder a una variable de instancia, necesitas una referencia a la instancia que la contiene.
Acceso a Variablesstaticdesde Métodosstatic:
Un método static puede acceder directamente a otras variables static y a otros métodos static de la misma clase porque todos pertenecen al mismo contexto, es decir, al contexto de la clase.
Ejemplo:
Imagina que tienes la siguiente clase:
javaCopiar códigopublic class Ejemplo {
// Variable de instancia (no estática) private int contador;
// Variable estática private static int contadorStatic;
// Método estático public static void incrementarContadorStatic() {
contadorStatic++; // Esto está bien porque contadorStatic es estática
// Esto causará un error de compilación // contador++;
}
}
Explicación:
contadorStatic: Es una variable estática y puede ser manipulada dentro del método incrementarContadorStatic porque ambos son static.
contador: Es una variable de instancia. Si intentas acceder a contador dentro de incrementarContadorStatic, obtendrás un error de compilación porque contador pertenece a una instancia específica de Ejemplo, mientras que incrementarContadorStatic no tiene referencia a ninguna instancia en particular.
¿Qué error ocurriría?
Si intentas acceder a una variable de instancia desde un método static, verás un error como este:
csharpCopiar códigonon-static variable contador cannot be referenced from a static context
Solución:
Hacer la variable estática:javaCopiar códigoprivate static int contador;
Si la variable debe ser accesible desde un contexto static, puedes declararla como static.
Acceder a la variable de instancia desde un método de instancia:javaCopiar códigopublic void incrementarContador() {
contador++;
}
Alternativamente, puedes asegurarte de que la variable de instancia solo sea manipulada desde métodos no estáticos.
static
* se puede usar en toda la clase
* está definido por la palabra reservada static
* utilizamos static para llamar una variable sin utilizar un objeto
* Puede ser accedido indicando el nombre de la clase, la notación punto y el nombre del método
* se invoca en una clase que no tiene instancias de la clase
* las variables static no pertenecen al objeto sino a la clase, se se modifica la variable static esto se verá reflejado en todos los objetos que hayan sido creados con esa clase
* una variable de este tipo, mantiene su ciclo de vida en todo el programa mientras este corriendo el programa
* variable static puede mutarse(cambiar de valor), variable final es inmutable (no puede cambiar de valor)
* Un método estático solo puede acceder a datos estáticos
* método static pertenece a la clase y no al objeto
* un método estático puede llamar solo a otros métodos estáticos y no puede invocar un método no estático a partir de él
con esta clase , me convenzo mas que aprender programacion, es mucho mejor por videos grabados , que clases presenciales, ya que muchas veces en clases presenciales si no entendiste en un punto el resto de la clase seguiras perdido, a menos que tengas que preguntar otra vez , y en general, en un video grabado puedes revisarlo y lo que no entendiste googlearlo para saber a mas profundidad.
Y tambien por la comunidad, las personas parecen interactuar mejor a traves de comentarios que a traves de las preguntas hechas en clases presenciales, los foros y este tipo de funciones como los comentarios, permiten entender mejor ciertos temas, cuando varias personas aportan, muy chevere.
Formas de llamar a propiedades/métodos:
A través de los objetos de la clase
A través de la misma clase con los métodos estáticos
Métodos estáticos:
Podemos usarlo en toda la clase
Podemos accesar a ellos usando el nombre de la clase
No necesita instanciar objetos
Las variables y metodos static nos ahorran el crear un objeto y a la vez ahorramos memoria.
Tambien podemos poner nuestras propias constantes y metodos staticos en una clase especifica y mantener el codigo ordenado.
Buen aporte aunque lo de la memoria no es tan cierto, cuando declaramos métodos o variables estáticas estas al tener un Scope global deben estar disponibles para toda la aplicación y por ende el compilador debe revisar y compilar estos métodos apenas inicie la aplicación y por ende llenando la memoria, y de esta forma estos métodos y variables están listos para usarse.
Si lo piensas bien, la carga inicial de una aplicación grande con muchos métodos y variables estáticas podría tardar bastante, en cambio cuando usas un objeto y de el solo usas unos cuantos métodos y atributos en ciertos momentos reducirá la carga inicial y la acumulación de memoria inmediata.
y aquí empieza a salir el demonio de Java
Significa que un metodo estatico es un metodo donde no necesito crear e iniciarlizar?
exacto, no ocupa crearse debido a que no es parte de la instancia si no parte de la clase, en estos casos no es necesario crear un objeto debido a que ya existe por asi decirlo
¿Cual es la diferencia entre static y final?
static es una variable o clase global que puede mutarse, final es una variable o clase inmutable que no puede cambiarse
La diferencia entre estas dos son que static tu la puedes utilizar en variables como en métodos además
static te permite que tu puedas hacer llamados a diferentes a variables o métodos en diferentes clases.
En cambio Final es solo un tipo de variable que la utilizamos cuando queremos definir un valor el cual sea constante
Hay una cosa que no me queda clara. ¿Por qué necesito escribir static después de import?
No es necesario escribir static, pero sí te ahorraría la escritura de la notación punto. Ejemplo, si pones static, puedes tener la siguiente línea de código:
int number =suma(3,5);
Si NO pones static, tendrías que escribir la siguiente línea de código para obtener el mismo resultado:
int number =Calculadora.suma(3,5);
Una variable de caracter static puede ser modificada desde otra clase, pero una static final no, ¿verdad?
Exacto, de hecho una "variable" final es en realidad una forma de declarar una variable constante en Java
Si, es lo que en otras lenguajes serían las contantes,
Creo que vi el video 3 veces
=D igual
Es importante resaltar que cuando se declara un atributo o variable de forma static en una clase, dicho atributo tendrá siempre el mismo valor o contenido para todos los objetos que se creen de dicha clase.
Asta cuando alteren su valor con una asignación nueva, desde alguno de los llamados que se le hagan.
Class Notes
Static vs Non-Static methods
Non-Static: They require you to instantiate an object to use them
Static: They don't need to be instantiated to be used
In this case, whenever you want to use the add(a, b) method you won't need to "create a new calculator" to use it. Since the method is a static one, we can do:
Static imports allow you to use static methods and vars of a program without having to mention its class. Ex: instead of typing Math.PI to access the PI static var, we can just do import static java.lang.Math.*; to get all the static vars and methods from Math. So now we can just type PI, and we will get the same value as if we were to type Math.PI. Honestly, I don't like this type of approach and will rather just type Math.PI to know its presidency.
Excellent Notes
¿cuales son los criterios para un buen uso de los metodos estatic?
¿re efectos colaterales no deseados se puede tener cuando se abusa o se le da un mal uso a los metodos estaticos?
Una clase estática no tendría sentido, ¿o sí?
¿Se puede decir que es como una interfaz?
Hola nos sirve para cuando creamos métodos Staticos, no tengamos la necesidad de accederlos desde l un objeto si no mas bien lo hacemos directo llamado la clase y listo
Buen día.
Una clase estática tiene sentido, pero solo si está contenida en otra clase, es decir, anidamiento de clases. Estas clases estáticas pueden acceder a los elementos que son estáticos de su clase contenedora, pero no a los demás elementos.
Una clase estática no es como una interfaz ya que una interfaz la puede pensar como si fuera un contrato que se compromete realizar la clase que lo implemente, en otras palabras, a las interfaces les interesa especificar qué hay que hacer, pero el como hacerlo lo deja a las clases que la implementen, en cambio, una clase estática puede crear sus propios métodos y además implementarlos, darles funcionamiento y estos pueden ser invocados desde otras clases. Además, una interfaz no puede ser instanciada y una clase estática si que puede.
Espero que sea de ayuda esta información.
Saludos.
Les comparto los apuntes que tome esta clase, es muy completo y leyéndolo podrán comprender o tener noción de lo que vimos en la clase.
**EXELENTES clases de Anahí, es la mejor explicando. LA AMO. su forma de enseñar me hace tenerle amor al aprendizaje **
Para delimitar un poco la función que tiene la palabra reservada Static, lo mejor es pensar en qué atributos de nuestro programa van a tener un valor constante durante toda la ejecución o que cambiarán en muy pocas situaciones, de la misma forma hacerlo con los métodos, y así a ellos otorgarles la característica Static. Esto con la finalidad de que no se ocupe un espacio en memoria con cada objeto que se instancia de esa clase, y en lugar de eso, siempre se use la misma variable que está ocupando un solo lugar en memoria.
¿Qué restricciones existen por volver una clase, atributo o método static? Por ejemplo, al volver un atributo static este mantendrá los valores en otras clases que se use.
Realmente los atributos y métodos static son métodos y atributos de clase, lo que quiere decir que pertenecen a la clase y no a los objetos que se instancien con ella.
La restricciones dependerán de las guías de desarrollo que sigan en el proyecto que estés desarrollando. Hay recomendaciones que se siguen según las guías de diseño orientado a objetos. Y sí, al volver un atributo de clase a static este mantendrá los valores en otras clases que se usen.