Clases y objetos en Java
Introducción
Las clases y los objetos constituyen el núcleo de la programación orientada a objetos en Java. Una clase es una plantilla o modelo que define las características y comportamientos que tendrán los objetos creados a partir de ella. Los objetos, por su parte, son instancias concretas de estas clases, con valores específicos para sus atributos y la capacidad de ejecutar los métodos definidos. En este artículo, exploraremos estos conceptos fundamentales que te permitirán comenzar a estructurar tus programas de manera orientada a objetos.
Definición de una clase en Java
Una clase en Java se define utilizando la palabra clave class
seguida del nombre de la clase y un bloque de código delimitado por llaves {}
. Dentro de este bloque, definimos los atributos (variables) y métodos (funciones) que conformarán la clase.
public class Coche {
// Atributos (también llamados variables de instancia)
String marca;
String modelo;
int año;
String color;
double velocidad;
// Métodos
void acelerar(double incremento) {
velocidad += incremento;
System.out.println("El coche acelera a " + velocidad + " km/h");
}
void frenar(double decremento) {
if (velocidad - decremento >= 0) {
velocidad -= decremento;
} else {
velocidad = 0;
}
System.out.println("El coche frena hasta " + velocidad + " km/h");
}
void mostrarInfo() {
System.out.println("Coche: " + marca + " " + modelo + " (" + año + ")");
System.out.println("Color: " + color);
System.out.println("Velocidad actual: " + velocidad + " km/h");
}
}
En este ejemplo, hemos definido una clase Coche
con varios atributos que describen sus características (marca, modelo, año, color y velocidad) y métodos que representan acciones que un coche puede realizar (acelerar, frenar y mostrar información).
Creación de objetos (instanciación)
Una vez definida una clase, podemos crear objetos (instancias) de esa clase utilizando el operador new
. Este proceso se conoce como instanciación.
public class PruebaCoche {
public static void main(String[] args) {
// Creación de un objeto de la clase Coche
Coche miCoche = new Coche();
// Asignación de valores a los atributos
miCoche.marca = "Seat";
miCoche.modelo = "Ibiza";
miCoche.año = 2020;
miCoche.color = "Rojo";
miCoche.velocidad = 0;
// Llamada a los métodos del objeto
miCoche.mostrarInfo();
miCoche.acelerar(50);
miCoche.mostrarInfo();
miCoche.frenar(20);
miCoche.mostrarInfo();
// Creación de un segundo objeto
Coche otroCoche = new Coche();
otroCoche.marca = "Renault";
otroCoche.modelo = "Clio";
otroCoche.año = 2019;
otroCoche.color = "Azul";
otroCoche.velocidad = 0;
otroCoche.mostrarInfo();
otroCoche.acelerar(70);
}
}
La salida de este programa sería algo así:
Coche: Seat Ibiza (2020)
Color: Rojo
Velocidad actual: 0.0 km/h
El coche acelera a 50.0 km/h
Coche: Seat Ibiza (2020)
Color: Rojo
Velocidad actual: 50.0 km/h
El coche frena hasta 30.0 km/h
Coche: Seat Ibiza (2020)
Color: Rojo
Velocidad actual: 30.0 km/h
Coche: Renault Clio (2019)
Color: Azul
Velocidad actual: 0.0 km/h
El coche acelera a 70.0 km/h
Atributos de clase
Los atributos de una clase (también llamados campos o variables de instancia) definen las características o propiedades que tendrán los objetos de esa clase. Cada objeto tendrá su propia copia de estos atributos con valores independientes.
Declaración de atributos
Los atributos se declaran dentro de la clase pero fuera de cualquier método:
public class Persona {
// Atributos
String nombre;
String apellido;
int edad;
double altura;
boolean esEstudiante;
}
Tipos de atributos
Los atributos pueden ser de cualquier tipo de dato en Java:
- Tipos primitivos:
int
,double
,boolean
, etc. - Tipos de referencia:
String
, arrays, otras clases, etc.
Modificadores de acceso para atributos
Podemos definir quién puede acceder a los atributos utilizando modificadores de acceso:
public class Empleado {
// Público - accesible desde cualquier parte
public String nombre;
// Privado - solo accesible dentro de la clase
private double salario;
// Protegido - accesible en la clase y sus subclases
protected int añosAntiguedad;
// Sin modificador (paquete) - accesible dentro del mismo paquete
String departamento;
}
Métodos de clase
Los métodos definen el comportamiento de los objetos, es decir, las acciones que pueden realizar. Son similares a las funciones en otros lenguajes de programación.
Declaración de métodos
Un método se declara con un tipo de retorno (o void
si no devuelve nada), un nombre, y opcionalmente una lista de parámetros:
public class Calculadora {
// Método que recibe dos parámetros y devuelve un resultado
int sumar(int a, int b) {
return a + b;
}
// Método que no devuelve nada (void)
void mostrarMensaje(String mensaje) {
System.out.println("Mensaje: " + mensaje);
}
}
Llamada a métodos
Para llamar a un método, utilizamos la sintaxis objeto.metodo(argumentos)
:
Calculadora miCalculadora = new Calculadora();
int resultado = miCalculadora.sumar(5, 3);
System.out.println("Resultado: " + resultado);
miCalculadora.mostrarMensaje("Operación completada");
Acceso a atributos y métodos
Para acceder a los atributos y métodos de un objeto, se utiliza la notación de punto (.
):
Persona persona1 = new Persona();
persona1.nombre = "Laura"; // Acceso a un atributo
persona1.saludar(); // Llamada a un método
Variables de referencia
Cuando creamos un objeto con new
, se devuelve una referencia a ese objeto. Esta referencia se almacena en una variable y nos permite interactuar con el objeto:
Coche coche1 = new Coche(); // coche1 es una variable de referencia
Es importante entender que la variable no contiene el objeto en sí, sino una referencia (o dirección de memoria) donde se encuentra el objeto.
Referencias múltiples a un mismo objeto
Varias variables pueden referirse al mismo objeto:
Coche coche1 = new Coche();
coche1.marca = "Toyota";
Coche coche2 = coche1; // coche2 y coche1 apuntan al mismo objeto
coche2.marca = "Honda"; // Cambia el atributo tanto para coche1 como para coche2
System.out.println(coche1.marca); // Imprime "Honda"
La palabra clave this
La palabra clave this
se refiere al objeto actual en el que se está ejecutando el código. Es útil para distinguir entre atributos de la clase y parámetros con el mismo nombre:
public class Rectangulo {
double ancho;
double alto;
void inicializar(double ancho, double alto) {
this.ancho = ancho; // this.ancho se refiere al atributo de la clase
this.alto = alto; // alto se refiere al parámetro
}
double calcularArea() {
return this.ancho * this.alto;
}
}
Ejercicio práctico
Vamos a crear una clase CuentaBancaria
con sus atributos y métodos, y luego utilizarla en un programa principal:
public class CuentaBancaria {
// Atributos
String titular;
String numeroCuenta;
double saldo;
// Métodos
void depositar(double cantidad) {
if (cantidad > 0) {
saldo += cantidad;
System.out.println("Se han depositado " + cantidad + " euros. Saldo actual: " + saldo);
} else {
System.out.println("La cantidad a depositar debe ser positiva");
}
}
void retirar(double cantidad) {
if (cantidad > 0) {
if (saldo >= cantidad) {
saldo -= cantidad;
System.out.println("Se han retirado " + cantidad + " euros. Saldo actual: " + saldo);
} else {
System.out.println("Saldo insuficiente. Operación cancelada");
}
} else {
System.out.println("La cantidad a retirar debe ser positiva");
}
}
void consultarSaldo() {
System.out.println("Titular: " + titular);
System.out.println("Número de cuenta: " + numeroCuenta);
System.out.println("Saldo disponible: " + saldo + " euros");
}
}
Ahora, vamos a utilizar esta clase en un programa principal:
public class GestionBancaria {
public static void main(String[] args) {
// Crear una cuenta bancaria
CuentaBancaria cuenta1 = new CuentaBancaria();
cuenta1.titular = "Carlos Rodríguez";
cuenta1.numeroCuenta = "ES1234567890";
cuenta1.saldo = 1000.0;
// Realizar operaciones
cuenta1.consultarSaldo();
cuenta1.depositar(500.0);
cuenta1.retirar(200.0);
cuenta1.retirar(2000.0); // Intentar retirar más de lo disponible
cuenta1.consultarSaldo();
// Crear otra cuenta
CuentaBancaria cuenta2 = new CuentaBancaria();
cuenta2.titular = "Ana López";
cuenta2.numeroCuenta = "ES0987654321";
cuenta2.saldo = 2500.0;
cuenta2.consultarSaldo();
cuenta2.retirar(1000.0);
cuenta2.consultarSaldo();
}
}
Resumen
En este artículo, hemos explorado los conceptos fundamentales de clases y objetos en Java. Una clase es una plantilla que define atributos (características) y métodos (comportamientos), mientras que un objeto es una instancia concreta de una clase. Hemos aprendido a definir clases, crear objetos, acceder a atributos y métodos, y utilizar la palabra clave this
. Estos conceptos son la base de la programación orientada a objetos y serán esenciales en tu camino como desarrollador Java. En el próximo artículo, profundizaremos en los métodos, sus parámetros y valores de retorno, lo que te permitirá crear funcionalidades más complejas en tus programas.