Métodos estáticos
Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy — lección 16 de 87.
Al igual que las variables estáticas pertenecen a la clase en lugar de a las instancias, los métodos estáticos también pertenecen a la propia clase. Puedes llamarlos sin crear un objeto.
Declara un método estático añadiendo la palabra clave static:
public class MathHelper {
public static int add(int a, int b) {
return a + b;
}
public static int multiply(int a, int b) {
return a * b;
}
}
// Call without creating an object
int sum = MathHelper.add(5, 3); // 8
int product = MathHelper.multiply(4, 2); // 8Los métodos estáticos tienen una restricción importante: no pueden acceder directamente a variables de instancia o métodos de instancia. Dado que los métodos estáticos existen sin un objeto, no hay una referencia this con la que trabajar.
public class Counter {
private int count; // Variable de instancia
private static int total; // Variable estática
public static void incrementTotal() {
total++; // OK - accediendo a una variable estática
// count++; // ¡Error! No se puede acceder a una variable de instancia
}
}Los métodos estáticos son ideales para operaciones de utilidad que no dependen del estado del objeto; piense en métodos como Math.sqrt() o Integer.parseInt(). Proporcionan funcionalidad que tiene sentido a nivel de clase en lugar de para objetos individuales.
Desafío
Fácil¡Vamos a construir una clase de utilidad StringUtils que proporcione métodos útiles de manipulación de cadenas sin necesidad de crear ningún objeto, lo cual es perfecto para demostrar los métodos estáticos!
Crearás dos archivos para organizar tu código:
StringUtils.java: Crea una clase de utilidad con métodos estáticos que realicen operaciones comunes de cadenas:- Un método estático
countVowels(String text)que devuelva el número de vocales (a, e, i, o, u - tanto en mayúsculas como en minúsculas) en la cadena dada. - Un método estático
reverse(String text)que devuelva la cadena invertida. - Un método estático
isPalindrome(String text)que devuelvatruesi la cadena se lee igual de adelante hacia atrás que de atrás hacia adelante (insensible a mayúsculas y minúsculas), yfalseen caso contrario.
- Un método estático
Main.java: Utiliza tu clase de utilidad para procesar una cadena. Recibirás una entrada: una cadena de texto. Llama a cada método estático directamente a través del nombre de la clase e imprime tres líneas:Vowels: [count]Reversed: [reversed string]Palindrome: trueoPalindrome: false
Recibirás una entrada: una cadena de texto para analizar.
Recuerda que los métodos estáticos se llaman utilizando el nombre de la clase (como StringUtils.countVowels(text)) en lugar de crear una instancia primero. Esto hace que las clases de utilidad sean convenientes para operaciones que no necesitan mantener ningún estado entre llamadas.
Hoja de referencia
Los métodos estáticos pertenecen a la propia clase y pueden llamarse sin crear un objeto. Decláralos usando la palabra clave static:
public class MathHelper {
public static int add(int a, int b) {
return a + b;
}
}
// Llamada sin crear un objeto
int sum = MathHelper.add(5, 3); // 8Restricción importante: Los métodos estáticos no pueden acceder directamente a variables de instancia o métodos de instancia, ya que existen sin un objeto y no tienen referencia this:
public class Counter {
private int count; // Variable de instancia
private static int total; // Variable estática
public static void incrementTotal() {
total++; // Correcto - accediendo a una variable estática
// count++; // ¡Error! No se puede acceder a una variable de instancia
}
}Los métodos estáticos son ideales para operaciones de utilidad que no dependen del estado del objeto, como Math.sqrt() o Integer.parseInt().
Pruébalo tú mismo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String text = scanner.nextLine();
// TODO: Usar los métodos estáticos de StringUtils para analizar el texto
// Llamar a StringUtils.countVowels(text) para obtener el recuento de vocales
// Llamar a StringUtils.reverse(text) para obtener la cadena invertida
// Llamar a StringUtils.isPalindrome(text) para comprobar si es un palíndromo
// TODO: Imprimir los resultados en el formato:
// Vowels: [count]
// Reversed: [reversed string]
// Palindrome: true/false
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a la OOPClases vs. ObjetosLa palabra clave thisMétodosCampos (Atributos)Método constructorSobrecarga de constructoresResumen - Calculadora simple4Herencia
Herencia básica (extends)La palabra clave superSobrescritura de métodos (@Override)Encadenamiento de constructoresLa clase ObjectHerencia simple y multinivelPor qué no hay herencia múltiple de clasesResumen - Jerarquía de empleados7Métodos especiales y la clase Object
Método toString()equals() y hashCode()Método clone()compareTo() y ComparableInterfaz ComparatorResumen - Ordenamiento personalizado2Modificadores de acceso y encapsulamiento
Visión general de los niveles de accesoMétodos Getter y SetterOcultamiento de informaciónLa palabra clave finalResumen - Gestor de cuentas bancarias5Polimorfismo
Fundamentos de sobrecarga de métodosSobrescritura de métodos (tiempo de ejecución)Upcasting y DowncastingEl operador instanceofClases y métodos abstractosResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaAgregación vs. ComposiciónClases internas, anidadas y anónimasEnums y métodos de EnumRecords (Java 16+)Clases selladas (Java 17+)11Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón BuilderPatrón ObserverPatrón Strategy3Propiedades de clase y miembros estáticos
Variables de instancia vs. estáticasMétodos estáticosBloques estáticosConstantes (static final)Repaso - Contador y utilidad6Interfaces y Clases Abstractas
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesMétodos Default y Static en InterfacesClases Abstractas vs InterfacesInterfaces FuncionalesResumen - Sistema de Pagos9Genéricos
Introducción a los genéricosClases genéricasMétodos genéricosParámetros de tipo delimitadosComodines (?, extends, super)Resumen - Contenedor genérico12Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Iterator