1. java-hell.de
  2. Temas
  3. Clases y objetos
Tema 8 de 11

Aprende clases y objetos en Java – Practica POO

Ahora toca orientación a objetos. Crearás tu primera clase, escribirás un constructor, darás métodos propios a tus objetos y harás que unas clases hereden de otras: la base de casi cualquier proyecto Java.

Los ejercicios

Lo que aprenderás en este tema

  1. Tu primera clase
  2. Constructor
  3. Métodos en una clase
  4. Herencia
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.

Basta de leer. Te toca.

En el tutorial escribes el código tú mismo, pulsas Ejecutar y ves al instante si tu programa funciona. Sin JDK, sin IDE, sin rollos.

Practicar Clases y objetos en tu navegador