1. Métodos estáticos

Además de las variables estáticas, las clases también pueden tener métodos estáticos.

Los métodos regulares están vinculados a objetos (instancias) de una clase y pueden referirse a variables ordinarias (no estáticas) de la clase (así como a variables y métodos estáticos ). Los métodos estáticos están vinculados al objeto estático de la clase y solo pueden acceder a las variables estáticas y/u otros métodos estáticos de la clase.

Para llamar a un método ordinario (no estático) en una clase, primero debe crear un objeto de la clase y luego llamar al método en el objeto. No puede llamar a un método ordinario en la clase en lugar de un objeto.

Ejemplo:

¡No puede llamar a un método no estático en una clase!
public class DataInfo
{
   public int getValue()
   {
      return 100;
   }
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.getValue()); // This will generate an error!
   }
}

Pero para llamar a un método estático, es suficiente que el objeto estático de la clase simplemente exista (y siempre existe después de que la clase se carga en la memoria). Esta es la razón por la que el método main() es estático. Está vinculado al objeto estático de la clase, por lo que no necesita crear ningún objeto para llamarlo.

Para declarar un método estático, debe escribir la palabra clave estática antes del encabezado del método. La apariencia general de esta construcción es la siguiente:

static Type name(parameters)
{
   method code
}

Ejemplos:

Código Nota
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

   public static void test()
   {
      int d = 2/0;
   }
}


La máquina Java llama al mainmétodo con un comando como este: Solution.main();



El método estático test()se llama en el main()método estático.

Para llamar a un método estático desde otra clase, debe especificar el nombre de la clase antes del nombre del método estático. La apariencia general de esta construcción es la siguiente:

Type name = ClassName.methodName(arguments)

Ejemplos:

Código método estático
int x = Math.min(a, b);
int min(int a, int b)
Thread.sleep(200);
void sleep(long ms)
Path path = Path.of("c:\\readme.txt");
Path of(String str)


2. Métodos estáticos vs ordinarios (no estáticos)

¿Cuál es la diferencia entre los métodos estáticos y los ordinarios?

Un método ordinario está vinculado a un objeto ordinario (una instancia de una clase), mientras que un método estático no lo está. Un método ordinario puede acceder a las variables en su instancia, pero un método estático no puede: simplemente no tiene una instancia asociada.

Las diferencias entre los dos tipos de métodos se expresan en la siguiente tabla:

Habilidad/propiedad método ordinario método estático
Vinculado a una instancia de la clase. No
Puede llamar a los métodos ordinarios de la clase. No
Puede llamar a métodos estáticos de la clase.
Puede acceder a las variables ordinarias de la clase. No
Puede acceder a variables estáticas de la clase.
Se puede llamar a un objeto
Se puede llamar a la clase. No

¿Por qué se necesitan tales métodos si están tan severamente limitados? La respuesta es que este enfoque también tiene sus ventajas.

Primero, no necesita pasar ninguna referencia de objeto para acceder a métodos y variables estáticos.

En segundo lugar, a veces necesita que haya una sola instancia de una variable. Por ejemplo, System.out( la variable de salida estática de la clase System ).

Y, en tercer lugar, a veces es necesario llamar a un método antes de que sea posible crear objetos. Por ejemplo, la máquina Java llama al método main() para iniciar la ejecución del programa incluso antes de que se cree una instancia de la clase.

Vinculado a una instancia de la clase.

Cuando se llama a un método ordinario, se le pasa implícitamente un argumento ( el objeto en el que se llama al método ). Este parámetro se llama this. Este parámetro implícito (una referencia al objeto en el que se llama al método) distingue los métodos ordinarios de los estáticos.

Los métodos estáticos no tienen este parámetro implícito, por lo que no puede usar la thispalabra clave dentro de los métodos estáticos y no puede llamar a un método no estático dentro de un método estático. Simplemente no hay ningún lugar para obtener una referencia a una instancia de una clase.

Puede llamar a los métodos ordinarios de la clase.

Un método ordinario siempre tiene el thisparámetro implícito, por lo que siempre tiene una referencia al objeto en el que se llama al método. Cada vez que llama a un método ordinario dentro de otro método ordinario, el thisparámetro implícito se usa para realizar esa llamada. Ejemplo

Código Cómo funciona
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = min(a, b);
   return min(t, c);
}
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = this.min(a, b);
   return this.min(t, c);
}

Es por eso que no puedes llamar a un método ordinario desde uno estático. Simplemente no hay una variable implícita nombrada thisdentro de un método estático.

O imagine otra situación: aún no se ha creado un solo objeto de nuestra clase en nuestro programa. ¿Podemos llamar a un método estático de nuestra clase? Sí. ¿Y puede este método estático llamar a un método ordinario (no estático)?

Bueno, ¿en qué objeto lo llamaríamos? Después de todo, ¡todavía no existe ni una sola instancia de nuestra clase!

Puede llamar a métodos estáticos de la clase.

Los métodos estáticos se pueden llamar desde cualquier lugar, desde cualquier lugar del programa. Esto significa que se pueden llamar tanto desde métodos estáticos como desde métodos ordinarios. No hay restricciones aquí.

Puede acceder a las variables ordinarias de la clase.

Puede acceder a las variables ordinarias de una clase desde un método ordinario, ya que puede obtener fácilmente una referencia a una instancia de la clase a través del thisparámetro implícito.

Un método estático no sabe qué instancia de la clase debe usar para obtener valores de variables ordinarias. Y, de manera más general, podemos tener fácilmente una situación en la que se llama a un método estático pero aún no se ha creado una sola instancia de la clase en el programa.

Como resultado, los métodos estáticos no pueden acceder a las variables ordinarias de una clase.

Supongamos que un método estático llama a un método ordinario. ¿Sobre qué objeto debería invocarse ese método ordinario?

Métodos estáticos

¡Nadie lo sabe! ¡Es por eso que no puede llamar a un método ordinario desde uno estático sin pasar una referencia a un objeto!

Puede acceder a variables estáticas de la clase.

La situación con llamadas a variables estáticas es la misma que con llamadas a métodos estáticos. Se puede acceder a las variables estáticas desde cualquier parte del programa. Eso significa que puede acceder a ellos desde métodos estáticos y ordinarios.

Se puede llamar a un objeto

Tanto los métodos estáticos como los ordinarios se pueden llamar en un objeto. Es posible llamar a un método ordinario; de hecho, esa es la única forma de llamar a un método ordinario. También se puede llamar a un método estático en un objeto: en este caso, el compilador mismo determina el tipo de la variable y llama al método estático en función de su tipo:

Código Cómo lo ve el compilador
Thread th = Thread.current();
th.sleep(1000);
Thread th = Thread.current();
Thread.sleep(1000);
Integer i = 1;
int x = i.parseInt("12");
Integer i = 1;
int x = Integer.parseInt("12");
"".valueOf(12);
String.valueOf(12);

Se puede llamar a la clase.

Solo puede llamar a un método estático en una clase. Para llamar a un método ordinario, necesita una referencia a una instancia de la clase. Por lo tanto, no puede llamar a un método ordinario usando esta construcción:ClassName.methodName(arguments)