Ejercicio 1 de 4
Tu primera clase
Una clase es un plano para crear objetos:
class Perro {
String nombre;
}
Un objeto se crea con new:
Perro p = new Perro();
p.nombre = "Toby";
Asigna BMW a la marca del auto antes de que se imprima.
Código inicial
void main() {
Auto a = new Auto();
// Asigna "BMW" a a.marca
IO.println(a.marca);
}
class Auto {
String marca;
}
Contexto
POO: Programación Orientada a Objetos
Java es un lenguaje orientado a objetos. La idea: modelas el mundo como objetos con propiedades (atributos) y comportamiento (métodos). Un Auto tiene una marca y puede conducir().
Los cuatro pilares de la POO: abstracción, encapsulamiento, herencia y polimorfismo. Los irás conociendo paso a paso.
Ejercicio 2 de 4
Constructor
En lugar de asignar los valores uno a uno, usas un constructor: un método especial que se ejecuta al crear el objeto:
class Perro {
String nombre;
Perro(String nombre) {
this.nombre = nombre;
}
}
this.nombre = el atributo de la clase. nombre = el parámetro.
Completa el constructor de la clase Auto.
Código inicial
void main() {
Auto a = new Auto("Tesla");
IO.println(a.marca);
}
class Auto {
String marca;
Auto(String marca) {
// Asigna el parámetro marca a this.marca
}
}
Contexto
this: la referencia a uno mismo
this se refiere al objeto actual. En el constructor necesitas this.marca = marca; porque el parámetro marca se llama igual que el atributo. Sin this, Java pensaría que asignas el parámetro a sí mismo, y el atributo se quedaría en null.
Consejo: muchos desarrolladores de Java les ponen a propósito a los parámetros el mismo nombre que a los atributos y usan this.. Es un estilo muy habitual.
Ejercicio 3 de 4
Métodos en una clase
Las clases pueden tener sus propios métodos:
class Perro {
String nombre;
String ladrar() {
return nombre + " dice ¡Guau!";
}
}
El método puede acceder a los atributos de la clase, sin necesidad de parámetros.
Completa el método info(): debe devolver [marca], [caballos] caballos.
Código inicial
void main() {
Auto a = new Auto("BMW", 150);
IO.println(a.info());
}
class Auto {
String marca;
int caballos;
Auto(String marca, int caballos) {
this.marca = marca;
this.caballos = caballos;
}
String info() {
// Devuelve "[marca], [caballos] caballos"
return "";
}
}
Contexto
toString(): el método universal
Toda clase en Java hereda de Object y tiene un método toString(). Cuando llamas a println(objeto), se llama automáticamente a objeto.toString().
Sin tu propio toString() obtienes algo como Auto@1a2b3c: el nombre de la clase más el hash code del objeto en hexadecimal (no es una dirección de memoria, aunque lo parezca). Por eso casi siempre se sobrescribe toString().
Ejercicio 4 de 4
Herencia
Una clase puede heredar de otra: se queda con todos sus atributos y métodos:
class Animal { String nombre; }
class Perro extends Animal { String raza; }
Ahora Perro tiene nombre (heredado de Animal) y raza.
En el constructor llamas a super() para ejecutar el constructor de la clase padre.
Completa el constructor de AutoElectrico: llama a super(marca) y asigna autonomia.
Código inicial
void main() {
AutoElectrico e = new AutoElectrico("Tesla", 500);
IO.println(e.marca + ", " + e.autonomia + " km");
}
class Auto {
String marca;
Auto(String marca) { this.marca = marca; }
}
class AutoElectrico extends Auto {
int autonomia;
AutoElectrico(String marca, int autonomia) {
// Llama a super(marca)
// Asigna this.autonomia
}
}
Contexto
Herencia y jerarquía de clases
En Java una clase solo puede heredar de una clase (herencia simple). Para algo parecido a la "herencia múltiple" existen las interfaces: contratos abstractos que una clase puede implementar.
Durante mucho tiempo, super() tenía que ser la primera instrucción del constructor. Desde Java 25 puedes poner algunas instrucciones antes (por ejemplo, para comprobar parámetros), siempre que no toquen this. La idea sigue siendo la misma: la parte del padre se inicializa antes de que la clase hija trabaje con sus propios atributos. Poner super() al principio sigue siendo el estilo habitual.