Aprende a crear Métodos y Constructores en Java con 10 ejercicios resueltos. Domina la sobrecarga y fortalece tus bases en la programación orientada a objetos.
Si las clases son los planos y los objetos son las casas, los métodos son las acciones que puedes realizar en ellas (como abrir una puerta) y los constructores son el proceso de construcción en sí. Entender cómo funcionan es crucial para que tus programas hagan cosas útiles. En este artículo, desmitificaremos estos conceptos clave con explicaciones sencillas y 10 ejercicios prácticos que te convertirán en un mejor programador. ¡Manos al código!
Aprendizaje Teórico: ¿Qué Son los Métodos y Constructores?
Antes de programar, es vital entender estas dos piezas del rompecabezas de la Programación Orientada a Objetos (POO).
Métodos: Las Acciones de tus Objetos
Un método es un bloque de código que contiene una serie de instrucciones. Piensa en él como una habilidad o una acción que un objeto puede realizar. Por ejemplo, un objeto Coche
podría tener los métodos acelerar()
, frenar()
y encenderLuces()
. Los métodos nos ayudan a organizar el código, hacerlo reutilizable y más fácil de leer.
La estructura básica de un método es:
visibilidad tipoDeRetorno nombreDelMetodo(parametros) { // Cuerpo del método }
tipoDeRetorno
: El tipo de dato que el método devolverá (ej.int
,String
,void
si no devuelve nada).nombreDelMetodo
: El nombre que le damos a la acción.parametros
: Los datos de entrada que el método necesita para funcionar (opcional).
Constructores: El Nacimiento de tus Objetos
Un constructor es un tipo especial de método que se llama automáticamente cuando se crea un objeto (una instancia) de una clase. Su principal propósito es inicializar los atributos del objeto, asegurando que nazca con un estado válido.
Características clave de un constructor:
- Tiene exactamente el mismo nombre que la clase.
- No tiene tipo de retorno, ni siquiera
void
.
Sobrecarga: Un Nombre, Múltiples Formas
La sobrecarga (overloading) es una potente característica de Java que permite definir varios métodos o constructores en la misma clase con el mismo nombre, siempre y cuando sus listas de parámetros sean diferentes (ya sea en el número de parámetros o en el tipo de dato de los mismos). Esto nos da flexibilidad para realizar acciones similares con diferentes tipos de entrada.
¡Tu Turno! Intenta Resolverlo Primero
La mejor forma de aprender es haciendo. Antes de saltar a la solución de cada ejercicio, tómate un momento para leer el problema, analizarlo y escribir tu propio código. No te preocupes si no es perfecto; el objetivo es que actives tu lógica de programación. ¡Luego, compara tu enfoque con el nuestro y aprende de las diferencias!
10 Ejercicios Resueltos de Métodos y Constructores
Ejercicio 1: El Saludo Universal
Problema: Crea una clase Persona
con un método saludar()
que no reciba parámetros y no devuelva nada, simplemente debe imprimir «¡Hola! ¿Cómo estás?» en la consola.
// Archivo: Persona.java
public class Persona {
// Método que no recibe parámetros y no retorna valor (void)
public void saludar() {
System.out.println("¡Hola! ¿Cómo estás?");
}
public static void main(String[] args) {
// Creamos un objeto de la clase Persona
Persona persona1 = new Persona();
// Llamamos a su método saludar()
persona1.saludar();
}
}
Ejercicio 2: Saludo Personalizado
Problema: Mejora la clase Persona
anterior. Ahora el método saludar()
debe recibir un parámetro de tipo String
con un nombre y personalizar el saludo, por ejemplo: «¡Hola, Ana! ¿Cómo estás?».
// Archivo: Persona.java
public class Persona {
// Método que recibe un parámetro de tipo String
public void saludar(String nombre) {
System.out.println("¡Hola, " + nombre + "! ¿Cómo estás?");
}
public static void main(String[] args) {
Persona persona1 = new Persona();
// Llamamos al método pasándole un argumento
persona1.saludar("Ana");
}
}
Ejercicio 3: Suma de Dos Números
Problema: Crea una clase Calculadora
con un método sumar()
que reciba dos números enteros como parámetros y devuelva su suma.
// Archivo: Calculadora.java
public class Calculadora {
// Método que recibe dos enteros y retorna su suma (int)
public int sumar(int numero1, int numero2) {
return numero1 + numero2;
}
public static void main(String[] args) {
Calculadora miCalculadora = new Calculadora();
// Llamamos al método y guardamos el resultado en una variable
int resultado = miCalculadora.sumar(10, 5);
System.out.println("El resultado de la suma es: " + resultado); // Salida: 15
}
}
Ejercicio 4: El Constructor por Defecto
Problema: Crea una clase Gato
con un atributo nombre
. Añade un constructor por defecto (sin parámetros) que inicialice el nombre del gato a «Anónimo».
// Archivo: Gato.java
public class Gato {
String nombre;
// Constructor por defecto (sin parámetros)
public Gato() {
this.nombre = "Anónimo"; // Inicializa el nombre
System.out.println("Se ha creado un gato llamado " + this.nombre);
}
public static void main(String[] args) {
// Al crear el objeto, se llama automáticamente al constructor
Gato gato1 = new Gato();
}
}
Ejercicio 5: Constructor con Parámetros
Problema: Modifica la clase Gato
. Ahora, el constructor debe recibir un String
como parámetro para asignarle ese nombre al gato al momento de su creación.
// Archivo: Gato.java
public class Gato {
String nombre;
// Constructor que recibe un parámetro para inicializar el atributo
public Gato(String nombre) {
this.nombre = nombre; // 'this.nombre' es el atributo, 'nombre' es el parámetro
}
public void maullar() {
System.out.println(this.nombre + " dice: ¡Miau!");
}
public static void main(String[] args) {
// Creamos el objeto pasándole el nombre al constructor
Gato miGato = new Gato("Pelusa");
miGato.maullar();
}
}
Ejercicio 6: Clase Termo
con Métodos y Constructor
Problema: Diseña una clase Termo
con los atributos marca
y capacidad
(en litros). Incluye un constructor para inicializar ambos atributos y un método cebar()
que imprima un mensaje.
// Archivo: Termo.java
public class Termo {
String marca;
double capacidad;
// Constructor para inicializar los atributos
public Termo(String marca, double capacidad) {
this.marca = marca;
this.capacidad = capacidad;
}
// Método de la clase
public void cebar() {
System.out.println("Cebando un mate con el termo " + this.marca + " de " + this.capacidad + "L.");
}
public static void main(String[] args) {
Termo miTermo = new Termo("Stanley", 1.2);
miTermo.cebar();
}
}
Ejercicio 7: Sobrecarga de Métodos
Problema: En la clase Calculadora
, sobrecarga el método sumar()
para que también pueda sumar dos números de tipo double
.
// Archivo: Calculadora.java
public class Calculadora {
// Método para sumar enteros
public int sumar(int a, int b) {
System.out.println("Sumando enteros...");
return a + b;
}
// Sobrecarga del método para sumar doubles
public double sumar(double a, double b) {
System.out.println("Sumando doubles...");
return a + b;
}
public static void main(String[] args) {
Calculadora calc = new Calculadora();
System.out.println("Resultado: " + calc.sumar(5, 4)); // Llama a la versión de int
System.out.println("Resultado: " + calc.sumar(5.5, 4.2)); // Llama a la versión de double
}
}
Ejercicio 8: Sobrecarga de Constructores
Problema: Crea una clase Producto
con atributos nombre
y precio
. Sobrecarga el constructor para que se pueda crear un producto de dos formas: solo con el nombre (precio por defecto en 0.0) o con nombre y precio.
// Archivo: Producto.java
public class Producto {
String nombre;
double precio;
// Constructor 1: solo recibe el nombre
public Producto(String nombre) {
this.nombre = nombre;
this.precio = 0.0; // Precio por defecto
}
// Constructor 2 (sobrecargado): recibe nombre y precio
public Producto(String nombre, double precio) {
this.nombre = nombre;
this.precio = precio;
}
public void mostrarInfo() {
System.out.println("Producto: " + nombre + ", Precio: $" + precio);
}
public static void main(String[] args) {
Producto p1 = new Producto("Taza"); // Usa el primer constructor
Producto p2 = new Producto("Laptop", 999.99); // Usa el segundo constructor
p1.mostrarInfo();
p2.mostrarInfo();
}
}
Ejercicio 9: Clase Usuario
Problema: Crea una clase Usuario
con atributos username
y password
. Añade un constructor para inicializarlos y un método login()
que reciba un usuario y contraseña y devuelva true
si coinciden con los del objeto y false
en caso contrario.
// Archivo: Usuario.java
public class Usuario {
String username;
String password;
public Usuario(String username, String password) {
this.username = username;
this.password = password;
}
// Método que verifica las credenciales
public boolean login(String username, String password) {
// Compara el input con los atributos del objeto
return this.username.equals(username) && this.password.equals(password);
}
public static void main(String[] args) {
Usuario user = new Usuario("admin", "12345");
if (user.login("admin", "12345")) {
System.out.println("Acceso concedido.");
} else {
System.out.println("Acceso denegado.");
}
}
}
Ejercicio 10: Conversor de Temperatura
Problema: Diseña una clase Conversor
con dos métodos: celsiusAFahrenheit()
que reciba grados Celsius y devuelva su equivalente en Fahrenheit ($F = C \* 9/5 + 32$), y fahrenheitACelsius()
que haga la conversión inversa ($C = (F – 32) \* 5/9$).
// Archivo: Conversor.java
public class Conversor {
// Método para convertir de Celsius a Fahrenheit
public double celsiusAFahrenheit(double celsius) {
return (celsius * 9.0 / 5.0) + 32;
}
// Método para convertir de Fahrenheit a Celsius
public double fahrenheitACelsius(double fahrenheit) {
return (fahrenheit - 32) * 5.0 / 9.0;
}
public static void main(String[] args) {
Conversor conversor = new Conversor();
double tempCelsius = 25.0;
double tempFahrenheit = 77.0;
System.out.println(tempCelsius + "°C son " + conversor.celsiusAFahrenheit(tempCelsius) + "°F");
System.out.println(tempFahrenheit + "°F son " + conversor.fahrenheitACelsius(tempFahrenheit) + "°C");
}
}
Preguntas Frecuentes (FAQs)
¿Cuál es la principal diferencia entre un método y un constructor?
La principal diferencia es su propósito y su sintaxis. Un constructor se usa para crear e inicializar un objeto y debe tener el mismo nombre que la clase, sin tipo de retorno. Un método se usa para definir un comportamiento o acción del objeto, tiene su propio nombre y debe especificar un tipo de retorno (incluso void
).
¿Por qué es útil la sobrecarga de métodos?
La sobrecarga mejora la legibilidad y la usabilidad del código. Te permite usar el mismo nombre de método para operaciones conceptualmente similares pero que se aplican a diferentes tipos o cantidades de datos. Por ejemplo, en lugar de tener sumarInt()
, sumarDouble()
, sumarTresNumeros()
, puedes simplemente tener un único nombre, sumar
, y Java sabrá cuál versión llamar según los argumentos que le pases.
¿Qué pasa si no defino ningún constructor en mi clase?
Si no escribes ningún constructor, Java proporciona uno por defecto automáticamente. Este es un constructor público y sin parámetros que no hace nada, pero permite que puedas crear objetos de esa clase (new MiClase();
). Sin embargo, si defines cualquier otro constructor (por ejemplo, uno con parámetros), Java ya no añadirá el constructor por defecto.
¡Ahora tus objetos tienen superpoderes!
¡Excelente trabajo! Has aprendido a darles vida y comportamiento a tus objetos a través de métodos y a controlar su creación con constructores. Estos dos conceptos son la base de la interacción en cualquier programa orientado a objetos. Dominarlos te permite escribir código más limpio, organizado y reutilizable.
Sigue practicando, crea tus propias clases con métodos y constructores personalizados. La curiosidad y la práctica constante son tus mejores aliadas en este viaje de la programación.
¿Listo para tu siguiente desafío? ¡Visita nuestro blog para descubrir más tutoriales sobre Java, desde conceptos básicos hasta temas avanzados, y sigue construyendo tu futuro como desarrollador!