Un método estático puede ser usado directamente desde la clase sin necesidad
de hacer referencia a ninguna instancia.
Estos métodos también son conocidos como métodos de clase, frente a los
métodos de objeto o instancia (es necesario un objeto para poder
invocarlos).
Los métodos estáticos no pueden manipular instancias (objetos) y suelen ser
utilizados para realizar operaciones genéricas independientes de las posibles instancias que
puedan existir de esa clase en un momento concreto. De hecho estos métodos pueden ser
invocados sin necesidad de que existan objetos de la clase.
La manera correcta de invocar a un método estático es escribiendo el nombre de la clase,
seguido por el operador punto (.) más el nombre del método estático:
NombreClase.nombreMetodoEstatico();
En alguna ocasión, es posible que te encuentres con programas donde se haya realizado la
llamada a un método estático escribiendo el nombre del objeto, seguido por el operador
punto (.) más el nombre del método estático. Esta forma de invocar a un método estático
no es apropiada. ¿Por qué? Porque aunque en efecto puede hacerse esa llamada y va a
funcionar, puede inducir a confusión a quien lea el código. Si se observa una llamada un
método a partir de un objeto lo normal es pensar que se está llamando a un método de ese
objeto para que realice operaciones teniendo en cuenta los atributos de ese objeto. Sin
embargo en el caso de un método estático no es así, pues un método estático jamás podrá
acceder ni alterar el estado de un objeto.
Es muy importante que cualquier
método estático se invoque siempre referenciado por el nombre de la clase a la que
pertenece, justamente para hacer explícito que se trata de un método estático
sin más que ver la sentencia donde se invoca, quedando claro que hace algo para la
clase, y no para un objeto particular. Es decir, algo como:
NombreClase.nombreMetodoEstatico()
En la biblioteca de Clases de la API Java existen muchas clases que contienen métodos
estáticos, ya los iremos viendo poco a poco según los vayamos necesitando.
Un ejemplo típico de clase con muchos métodos estáticos es la clase Math que se encuentra en
el paquete java.lang (clase java.lang.Math).
Esta clase tiene además la particularidad de que no puede ser instanciada, es decir, que no
se pueden tener objetos de ella. Por tanto todos sus métodos son obligatoriamente estáticos.
Todos los métodos de la clase Math
son estáticos.
Esta clase podemos imaginarla como una especie de "caja de herramientas" (toolbox) que proporciona una serie de métodos para ser usados
sin necesidad de objetos instancia de la clase. De hecho es para lo que se utiliza, para
contener una extensa lista de funciones matemáticas a las que podemos invocar cuando nos
haga falta.
Aquí tienes algunos ejemplos de métodos de la clase (todos estáticos):
static double abs(double a) // Calcula y devuelve el valor absoluto del parámetro
static double cos(double a) // Calcula y devuelve el coseno trigonométrico del parámetro
static double exp(double a) // Calcula y devuelve el número e elevado a la potencia indicada por el parámetro
static double log(double a) // Calcula y devuelve el logaritmo neperiano del parámetro
static double max(double a, double b) // Calcula y devuelve el máximo de los dos parámetros
static double pow(double a, double b) // Calcula y devuelve el valor del primer parámetro elevado al segundo
static double sqrt(double a) // Calcula y devuelve la raíz cuadrada del parámetro
static double random() // Devuelve un valor aleatorio mayor o igual que 0.0 y menor que 1.0
Esta clase también proporciona algunos atributos públicos con algunas de las constantes más
habituales en matemáticas:
- la constante "e" de Euler (Math.E);
- el número pi: π (Math.PI.).
public static double E // El valor aproximado del número e (2,718281828459045)
public static double PI // Un valor aproximado de pi (3.141592653589793)
Estos atributos, al igual que los métodos, son también estáticos (tienen existencia y valor
independientemente de la existencia o no de objetos instancia de la clase) pues todos los
miembros (métodos y atributos) de la clase Math son estáticos.
Aquí tienes algunos ejemplos de uso de estos métodos y atributos estáticos:
// Funciones trigonométricas
double angulo = 45.0 * Math.PI/270.0;
System.out.println("cos(" + angulo + ")= " + Math.cos(angulo));
//La función exponencial devuelve el número e elevado a una potencia
System.out.println("exp(10.0)= " + Math.exp(10.0));
// Logaritmo natural (de base e) de un número
System.out.println("log(10.0)= " + Math.log(10.0));
System.out.println("log(Math.E)= " + Math.log(Math.E));
// Elevar 10 a la potencia 2.5
System.out.println("pow(10.0, 2.5)= " + Math.pow(10.0,2.5));
// Hallar la raíz cuadrada de un número
System.out.println("Raíz cuadrada de 3= " + Math.sqrt(3));
La salida por pantalla debería dar algo así:
cos(0.5235987755982988)= 0.8660254037844387
exp(10.0)= 22026.465794806718
log(10.0)= 2.302585092994046
log(Math.E)= 1.0
pow(10.0, 2.5)= 316.22776601683796
Raíz cuadrada de 3= 1.7320508075688772
Otro ejemplo de clase con miembros estáticos que ya has utilizado es la clase System (de la
que luego volveremos a hablar en la unidad), que se encuentra en el paquete java.lang y
que contiene abudantes miembros estáticos. De hecho, al igual que sucede con Math, esta
clase tampoco puede ser instanciada, así que todos sus miembros son estáticos.
Veamos un pequeño ejemplo de acceso a algunos miembros estáticos (atributos y métodos)
de esta clase:
// Hora actual en milisegundos
long horaMiliseg = System.currentTimeMillis() ;
System.out.println("Hora actual en milisegundos: " + horaMiliseg);
// Separador en la ruta de archivos
String separador = System.getProperty("file.separator") ;
System.out.println("Separador de carpetas en las rutas: " + separador);
// Idioma
String idioma = System.getProperty("user.language") ;
System.out.println("Idioma: " + idioma);
// Versión de Java
String versionJava = System.getProperty("java.version") ;
System.out.println("Versión de Java: " + versionJava);
Si ejecutáramos esas líneas, la salida del programa nos mostraría algo parecido a esto
(dependiendo de las características de vuestro sistema):
Hora actual en milisegundos: 1604375707426
Separador de carpetas en las rutas: \
Idioma: es
Versión de Java: 1.8.0_151