CodeGym /Blog Java /Random-ES /10 cosas que debes saber sobre el modificador estático en...
Autor
Pavlo Plynko
Java Developer at CodeGym

10 cosas que debes saber sobre el modificador estático en Java

Publicado en el grupo Random-ES
En Java, el modificador estático significa que algo está directamente relacionado con una clase: si un campo es estático, entonces pertenece a la clase; si un método es estático, entonces pertenece a la clase. Como resultado, puede usar el nombre de la clase para llamar a un método estático o hacer referencia a un campo estático. Por ejemplo, si el countcampo es estático en la Counterclase, significa que puede hacer referencia a la variable con la siguiente expresión: Counter.count. 10 cosas que debes saber sobre el modificador estático en Java - 1Por supuesto, los modificadores de acceso deben ser considerados. Por ejemplo, privatelos campos están disponibles solo dentro de la clase en la que se declaran. Y protectedlos campos están disponibles para todas las clases dentro de un paquete, así como para todas sus subclases fuera del paquete. Supongamos que la Counterclase tiene un método estático increment()cuyo trabajo es incrementar elcountcampo. Para llamar a este método, puede usar Counter.increment(). No es necesario crear una instancia de la Counterclase para acceder a un campo o método estático. Esta es la diferencia fundamental entre variables y métodos estáticos (clase) y variables y métodos NO estáticos (instancia). Una nota importante. No olvide que los miembros estáticos de la clase pertenecen directamente a la clase, no a ninguna instancia de la clase. Es decir, el valor de la countvariable estática será el mismo para todos Counterlos objetos. En este artículo, veremos los aspectos fundamentales del uso del modificador estático en Java, así como algunas características que lo ayudarán a comprender los conceptos clave de programación.

Lo que todo programador debe saber sobre el modificador estático en Java.

En esta sección, analizamos los aspectos principales del uso de métodos, campos y clases estáticos. Comencemos con las variables.
  1. NO PUEDE acceder a miembros no estáticos de una clase dentro de un contexto estático, como un método o bloque estático. Compilar el siguiente código dará como resultado un error:

    
    public class Counter {
    private int count;
    public static void main(String args []) {
       System.out.println(count); //  Compile time error
    }
    }
    

    Este es uno de los errores más comunes que cometen los programadores de Java, especialmente los novatos. Dado que el mainmétodo es estático y la countvariable no lo es, usar el printlnmétodo dentro del mainmétodo producirá un "error de tiempo de compilación".

  2. A diferencia de las variables locales, los campos y métodos estáticos NO están thread safeen Java. En la práctica, esta es una de las causas más frecuentes de problemas de seguridad en la programación multiproceso. Teniendo en cuenta que cada instancia de una clase hace referencia a la misma copia de una variable estática, dicha variable debe estar protegida o "bloqueada" por la clase. Por lo tanto, cuando use variables estáticas, asegúrese de que estén correctamente synchronizedpara evitar problemas como race conditions.

  3. Los métodos estáticos tienen la ventaja práctica de que no es necesario crear un nuevo objeto cada vez que desee llamarlos. Se puede llamar a un método estático usando el nombre de la clase que lo declara. Es por eso que estos métodos son perfectos para factorymétodos y utilitymétodos. La java.lang.Mathclase es un maravilloso ejemplo: casi todos sus métodos son estáticos. Las clases de utilidad de Java están marcadas finalpor la misma razón.

  4. Otro punto importante es que no puede anular ( @Override) métodos estáticos. Si declara un método de este tipo en un subclass, es decir, un método con el mismo nombre y firma, simplemente "oculta" el método superclassen lugar de anularlo. Este fenómeno se conoce como method hiding. Esto significa que si se declara un método estático en las clases principal y secundaria, el método llamado siempre se basará en el tipo de variable en el momento de la compilación. A diferencia de la anulación de métodos, dichos métodos no se ejecutarán cuando se ejecute el programa. Consideremos un ejemplo:

    
    class Vehicle {
         public static void kmToMiles(int km) {
              System.out.println("Inside the parent class / static method");
         } 
    }
    
    class Car extends Vehicle {
         public static void kmToMiles(int km) {
              System.out.println("Inside the child class / static method");
         } 
    }
    
    public class Demo {   
       public static void main(String args []) {
          Vehicle v = new Car();
           v.kmToMiles(10);
      }
    }
    

    Salida de la consola:

    Dentro de la clase padre/método estático

    El código demuestra claramente que, a pesar de que el objeto es un , se llama Caral método estático de la clase, ya que se llamó al método en tiempo de compilación. Vehicle¡Y tenga en cuenta que no hubo errores de compilación!

  5. Además, además de las clases de nivel superior, puede declarar las clases estáticas. Tales clases se conocen como nested static classes. Son útiles para proporcionar una mejor cohesión. Un ejemplo llamativo de una clase estática anidada es HashMap.Entry, que es una estructura de datos dentro HashMap. Vale la pena señalar que, al igual que las clases internas, las clases anidadas estáticas se declaran en un archivo .class separado. Por lo tanto, si declara cinco clases anidadas en su clase principal, tendrá 6 archivos con la extensión .class. Otro ejemplo es la declaración propia Comparator, como un comparador de edad ( AgeComparator) en la Employeeclase.

  6. El modificador estático también se puede especificar en un bloque estático, más conocido como "bloque de inicialización estático", que se ejecuta cuando se carga la clase. Si no declara dicho bloque, Java recopila todos los campos estáticos en una sola lista y los inicializa cuando se carga la clase. Un bloque estático NO PUEDE arrojar excepciones marcadas, pero puede arrojar excepciones no marcadas. En este caso, ExceptionInInitializerErrorocurrirá un. En la práctica, cualquier excepción que ocurra durante la inicialización de campos estáticos será envuelta en este error por Java. Esta es también la causa más común de NoClassDefFoundError, porque la clase no estará en la memoria cuando se haga referencia a ella.

  7. Es útil saber que los métodos estáticos se vinculan en tiempo de compilación, a diferencia de los métodos virtuales o no estáticos, que se vinculan en tiempo de ejecución cuando se les llama en un objeto real. En consecuencia, los métodos estáticos no se pueden anular en Java, ya que el polimorfismo no se aplica a ellos en tiempo de ejecución. Esta es una limitación importante a tener en cuenta al declarar un método estático. Hacerlo tiene sentido solo cuando no hay capacidad o necesidad de anular el método en una subclase. Los métodos de fábrica y los métodos de utilidad son buenos ejemplos del uso adecuado del modificador estático. Joshua Bloch señala varias ventajas que los métodos de fábrica estáticos tienen sobre los constructores en su libro Java efectivo, que es una lectura obligatoria para todos los programadores de Java.

  8. La inicialización es un aspecto importante de un bloque estático. Los campos estáticos o las variables se inicializan después de que la clase se carga en la memoria. El orden de inicialización es de arriba a abajo, en el mismo orden en que se declaran en el archivo fuente de la clase Java. Dado que los campos estáticos se inicializan de forma segura para subprocesos, este proceso también se utiliza para implementar el Singletonpatrón. Si por alguna razón no está utilizando an Enumcomo a Singleton, entonces tiene una buena alternativa. Pero en este caso, debes tener en cuenta que no se trata de una inicialización "perezosa". Esto significa que el campo estático se inicializará incluso ANTES de que alguien "lo solicite". Si un objeto tiene muchos recursos o rara vez se usa, inicializarlo en un bloque estático no funcionará a su favor.

  9. Durante la serialización, los campos estáticos, como transientlas variables, no se serializan. De hecho, si guarda datos en un campo estático, contendrá su valor inicial (predeterminado) después de la deserialización. Por ejemplo, si un campo estático es un int, su valor será cero después de la deserialización. Si su tipo es float, el valor será 0.0. Si el campo es un Object, el valor será null. Para ser honesto, esta es una de las preguntas más frecuentes sobre serialización en entrevistas para puestos de Java. ¡No almacene datos de objetos esenciales en un campo estático!

  10. Finalmente, hablemos de la importación estática. Este modificador tiene mucho en común con la importinstrucción estándar, pero se diferencia en que le permite importar uno o todos los miembros de la clase estática. Una vez que se importan los métodos estáticos, se puede acceder a ellos como si estuvieran declarados en la misma clase. De manera similar, al importar campos estáticos, podemos acceder a ellos sin especificar el nombre de la clase. Esta característica apareció en Java 1.5 y mejora la legibilidad del código cuando se usa correctamente. Esta construcción se encuentra con mayor frecuencia en las pruebas JUnit, ya que casi todos los desarrolladores de pruebas utilizan la importación estática para los métodos de aserción, por ejemplo, assertEquals()y sus variantes sobrecargadas.

  11. Eso es todo por ahora. Todo programador de Java necesita conocer todos los aspectos del modificador estático mencionado anteriormente. Este artículo revisó información básica sobre variables estáticas, campos, métodos, bloques de inicialización e importaciones. También tocó algunas propiedades importantes que son esenciales para saber escribir y comprender programas Java. Espero que todos los desarrolladores perfeccionen su hábil uso de los miembros estáticos, porque es muy importante para el desarrollo de software serio".

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION