> For the complete documentation index, see [llms.txt](https://educacion.gitbook.io/programacion/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://educacion.gitbook.io/programacion/exercicios-java/ud4-solucions/herdanza.md).

# Herdanza

1. Coches y motos

a. Diagrama

{% @mermaid/diagram content="classDiagram
class Vehiculo {
-String matricula
-double velocidad
-int numRuedas
+Vehiculo(String matricula, int numRuedas)
+getMatricula() String
+getVelocidad() double
+getNumRuedas() int
+setVelocidad(double velocidad) void
+acelerar(double incremento) void
+describirse() String
}

```
class Coche {
    -int numPortas
    +Coche(String matricula, int numPortas)
    +getNumPortas() int
    +acelerar(double incremento) void
    +describirse() String
}

class Moto {
    -int cilindrada
    +Moto(String matricula, int cilindrada)
    +getCilindrada() int
    +acelerar(double incremento) void
    +describirse() String
}


Vehiculo <|-- Coche
Vehiculo <|-- Moto
```

" %}

b. Código

```java
// Clase base Vehiculo
public class Vehiculo {
    private String matricula;
    private double velocidad;
    private int numRuedas;
    
    // Constructor
    public Vehiculo(String matricula, int numRuedas) {
        this.matricula = matricula;
        this.numRuedas = numRuedas;
        this.velocidad = 0.0;
    }
    
    // Getters
    public String getMatricula() {
        return matricula;
    }
    
    public double getVelocidad() {
        return velocidad;
    }
    
    public int getNumRuedas() {
        return numRuedas;
    }
    
    // Setter para velocidad
    public void setVelocidad(double velocidad) {
        this.velocidad = velocidad;
    }
    
    // Método para acelerar
    public void acelerar(double incremento) {
        this.velocidad += incremento;
        System.out.println("Acelerando " + incremento + " km/h. Velocidad actual: " + this.velocidad + " km/h");
    }
    
    // Método para describirse
    public String describirse() {
        return "Vehículo - Matrícula: " + matricula + 
                         ", Velocidad: " + velocidad + 
                         " km/h, Ruedas: " + numRuedas;
    }
}

// Clase Coche que hereda de Vehiculo
class Coche extends Vehiculo {
    private int numPortas;
    
    // Constructor
    public Coche(String matricula, int numPortas) {
        super(matricula, 4); // Los coches siempre tienen 4 ruedas
        this.numPortas = numPortas;
    }
    
    // Getter
    public int getNumPortas() {
        return numPortas;
    }
    
    // Método acelerar sobreescrito
    @Override
    public void acelerar(double incremento) {
        // Redondear al múltiplo de 10 superior
        double incrementoRedondeado = Math.ceil(incremento / 10.0) * 10.0;
        System.out.println("Incremento solicitado: " + incremento + 
                         " km/h. Incremento aplicado: " + incrementoRedondeado + " km/h");
        super.setVelocidad(super.getVelocidad() + incrementoRedondeado);
        System.out.println("Acelerando " + incrementoRedondeado + 
                         " km/h. Velocidad actual: " + super.getVelocidad() + " km/h");
    }
    
    // Método describirse sobreescrito
    @Override
    public String describirse() {
        return super.describirse() + ", Puertas: " + numPortas;
    }
}

// Clase Moto que hereda de Vehiculo
class Moto extends Vehiculo {
    private int cilindrada;
    
    // Constructor
    public Moto(String matricula, int cilindrada) {
        super(matricula, 2); // Las motos siempre tienen 2 ruedas
        this.cilindrada = cilindrada;
    }
    
    // Getter
    public int getCilindrada() {
        return cilindrada;
    }
    
    // Método acelerar sobreescrito
    @Override
    public void acelerar(double incremento) {
        // Redondear al múltiplo de 10 superior
        double incrementoRedondeado = Math.ceil(incremento / 10.0) * 10.0;
        System.out.println("Incremento solicitado: " + incremento + 
                         " km/h. Incremento aplicado: " + incrementoRedondeado + " km/h");
        super.setVelocidad(super.getVelocidad() + incrementoRedondeado);
        System.out.println("Acelerando " + incrementoRedondeado + 
                         " km/h. Velocidad actual: " + super.getVelocidad() + " km/h");
    }
    
    // Método describirse sobreescrito
    @Override
    public String describirse() {
        return super.describirse() + 
                         ", Cilindrada: " + cilindrada + " cc";
    }
}

// Clase App para probar todos los métodos
public class App {
    public static void main(String[] args) {
        System.out.println("=== PRUEBA DEL SISTEMA DE VEHÍCULOS ===\n");
        
        // Crear un coche
        System.out.println("1. Creando un coche:");
        Coche coche = new Coche("1234ABC", 5);
        coche.describirse();
        
        // Probar aceleración del coche
        System.out.println("\n2. Probando aceleración del coche:");
        coche.acelerar(7); // Debería redondear a 10
        coche.acelerar(25); // Debería redondear a 30
        coche.describirse();
        
        // Crear una moto
        System.out.println("\n3. Creando una moto:");
        Moto moto = new Moto("5678DEF", 600);
        moto.describirse();
        
        // Probar aceleración de la moto
        System.out.println("\n4. Probando aceleración de la moto:");
        moto.acelerar(3); // Debería redondear a 10
        moto.acelerar(18); // Debería redondear a 20
        moto.describirse();
            
        // Probar métodos específicos de cada subtipo
        System.out.println("\n6. Accediendo a propiedades específicas:");
        System.out.println("Coche - Número de puertas: " + coche.getNumPortas());
        System.out.println("Moto - Cilindrada: " + moto.getCilindrada() + " cc");
    }
}
```

2. Material de biblioteca

{% @mermaid/diagram content="classDiagram
class MaterialBiblioteca {
-String codigo
-String titulo
-int anoPublicacion
-boolean dispoñible
+MaterialBiblioteca(String codigo, String titulo, int anoPublicacion)
+getCodigo() String
+getTitulo() String
+getAnoPublicacion() int
+isDispoñible() boolean
+prestar() void
+devolver() void
+describirse() String
}

```
class Libro {
    -String autor
    -int numeroPaginas
    +Libro(String codigo, String titulo, int anoPublicacion, String autor, int numeroPaginas)
    +Libro(String codigo, String titulo, String autor)
    +getAutor() String
    +getNumeroPaginas() int
    +describirse() String
}

class Revista {
    -int numeroEdicion
    -String mesPublicacion
    +Revista(String codigo, String titulo, int anoPublicacion, int numeroEdicion, String mesPublicacion)
    +Revista(String codigo, String titulo, int numeroEdicion)
    +getNumeroEdicion() int
    +getMesPublicacion() String
    +describirse() String
}

class DVD {
    -int duracionMinutos
    -String director
    +DVD(String codigo, String titulo, int anoPublicacion, int duracionMinutos, String director)
    +getDuracionMinutos() int
    +getDirector() String
    +reproducir() void
    +describirse() String
}

MaterialBiblioteca <|-- Libro
MaterialBiblioteca <|-- Revista
MaterialBiblioteca <|-- DVD" %}
```

```java
class MaterialBiblioteca {
    private String codigo;
    private String titulo;
    private int anoPublicacion;
    private boolean dispoñible;
    
    // Constructor
    public MaterialBiblioteca(String codigo, String titulo, int anoPublicacion) {
        this.codigo = codigo;
        this.titulo = titulo;
        this.anoPublicacion = anoPublicacion;
        this.dispoñible = false; // Por defecto non dispoñible
    }
    
    // Getters
    public String getCodigo() {
        return codigo;
    }
    
    public String getTitulo() {
        return titulo;
    }
    
    public int getAnoPublicacion() {
        return anoPublicacion;
    }
    
    public boolean isDispoñible() {
        return dispoñible;
    }
    
    // Métodos
    public void prestar() {
        if (dispoñible) {
            dispoñible = false;
            System.out.println("O material " + codigo + " foi prestado.");
        } else {
            System.out.println("O material " + codigo + " xa está prestado, non se pode prestar.");
        }
    }
    
    public void devolver() {
        dispoñible = true;
        System.out.println("O material " + codigo + " foi devolto.");
    }
    
    // Método para describirse
    public String describirse() {
        String estado = dispoñible ? "Dispoñible" : "Non dispoñible";
        return "Material - Código: " + codigo + 
               ", Título: " + titulo + 
               ", Ano: " + anoPublicacion + 
               ", Estado: " + estado;
    }
}

// Clase Libro que hereda de MaterialBiblioteca
class Libro extends MaterialBiblioteca {
    private String autor;
    private int numeroPaginas;
    
    // Constructor con todos os atributos - chama a super()
    public Libro(String codigo, String titulo, int anoPublicacion, String autor, int numeroPaginas) {
        super(codigo, titulo, anoPublicacion);
        this.autor = autor;
        this.numeroPaginas = numeroPaginas;
    }
    
    // Constructor con menos atributos - chama a this()
    public Libro(String codigo, String titulo, String autor) {
        this(codigo, titulo, 2024, autor, 100); // Valores por defecto
    }
    
    // Getters
    public String getAutor() {
        return autor;
    }
    
    public int getNumeroPaginas() {
        return numeroPaginas;
    }
    
    // Método describirse sobreescrito
    @Override
    public String describirse() {
        return super.describirse() + 
               ", Autor: " + autor + 
               ", Páxinas: " + numeroPaginas;
    }
}

// Clase Revista que hereda de MaterialBiblioteca
class Revista extends MaterialBiblioteca {
    private int numeroEdicion;
    private String mesPublicacion;
    
    // Constructor con todos os atributos - chama a super()
    public Revista(String codigo, String titulo, int anoPublicacion, int numeroEdicion, String mesPublicacion) {
        super(codigo, titulo, anoPublicacion);
        this.numeroEdicion = numeroEdicion;
        this.mesPublicacion = mesPublicacion;
    }
    
    // Constructor con menos atributos - chama a this()
    public Revista(String codigo, String titulo, int numeroEdicion) {
        this(codigo, titulo, 2025, numeroEdicion, "Xaneiro"); // Valores por defecto
    }
    
    // Getters
    public int getNumeroEdicion() {
        return numeroEdicion;
    }
    
    public String getMesPublicacion() {
        return mesPublicacion;
    }
    
    // Método describirse sobreescrito
    @Override
    public String describirse() {
        return super.describirse() + 
               ", Edición: " + numeroEdicion + 
               ", Mes: " + mesPublicacion;
    }
}

// Clase DVD que hereda de MaterialBiblioteca
class DVD extends MaterialBiblioteca {
    private int duracionMinutos;
    private String director;
    
    // Constructor con todos os atributos - chama a super()
    public DVD(String codigo, String titulo, int anoPublicacion, int duracionMinutos, String director) {
        super(codigo, titulo, anoPublicacion);
        this.duracionMinutos = duracionMinutos;
        this.director = director;
    }
    
    // Getters
    public int getDuracionMinutos() {
        return duracionMinutos;
    }
    
    public String getDirector() {
        return director;
    }
    
    // Método para reproducir
    public void reproducir() {
        System.out.println("Reproducindo DVD: " + getTitulo());
        
        for (int minuto = 0; minuto <= duracionMinutos; minuto+=5) {
            // Mostrar cada 5 minutos
            
                double porcentaxe = (minuto * 100.0) / duracionMinutos;
                System.out.printf("Minuto %d/%d (%.1f%% completado)%n", 
                                 minuto, duracionMinutos, porcentaxe);
        }
        
        System.out.println("Reproducción rematada.");
    }
    
    // Método describirse sobreescrito
    @Override
    public String describirse() {
        return super.describirse() + 
               ", Duración: " + duracionMinutos + " minutos" + 
               ", Director: " + director;
    }
}

// Clase App para probar todos os métodos
public class App {
    public static void main(String[] args) {
        System.out.println("=== SISTEMA DE XESTIÓN DE BIBLIOTECA ===\n");
        
        // 1. Probar Libro con diferentes construtores
        System.out.println("1. CREANDO LIBROS:");
        System.out.println("-------------------");
        
        // Libro con constructor completo
        Libro libro1 = new Libro("LIB001", "O Señor dos Aneis", 1954, "J.R.R. Tolkien", 1178);
        System.out.println("Libro 1 (constructor completo):");
        System.out.println(libro1.describirse());
        
        // Libro con constructor reducido
        Libro libro2 = new Libro("LIB002", "A Sombra do Vento", "Carlos Ruiz Zafón");
        System.out.println("\nLibro 2 (constructor reducido):");
        System.out.println(libro2.describirse());
        
        // 2. Probar Revista con diferentes construtores
        System.out.println("\n\n2. CREANDO REVISTAS:");
        System.out.println("---------------------");
        
        // Revista con constructor completo
        Revista revista1 = new Revista("REV001", "National Geographic", 2024, 150, "Marzo");
        System.out.println("Revista 1 (constructor completo):");
        System.out.println(revista1.describirse());
        
        // Revista con constructor reducido
        Revista revista2 = new Revista("REV002", "Muy Interesante", 375);
        System.out.println("\nRevista 2 (constructor reducido):");
        System.out.println(revista2.describirse());
        
        // 3. Probar DVD
        System.out.println("\n\n3. CREANDO DVDs:");
        System.out.println("-----------------");
        
        DVD dvd1 = new DVD("DVD001", "O labirinto do fauno", 2006, 118, "Guillermo del Toro");
        System.out.println("DVD 1:");
        System.out.println(dvd1.describirse());
        
        DVD dvd2 = new DVD("DVD002", "A vida dos outros", 2006, 137, "Florian Henckel von Donnersmarck");
        System.out.println("\nDVD 2:");
        System.out.println(dvd2.describirse());
        
        // 4. Probar métodos de préstamo e devolución
        System.out.println("\n\n4. PRESTAR E DEVOLVER MATERIAIS:");
        System.out.println("----------------------------------");
        
        // Todos comezan como non dispoñibles
        libro1.devolver(); // Agora está dispoñible
        libro1.prestar();  // Préstase
        libro1.prestar();  // Intento de préstamo repetido (non debería funcionar)
        libro1.devolver(); // Devolución
        
    
        // 5. Probar reproducción de DVD
        System.out.println("\n\n6. REPRODUCIÓN DE DVD (versión rápida):");
        System.out.println("----------------------------------------");
        
        // DVD curto para probar a reproducción
        DVD dvdCorto = new DVD("DVDTEST", "Proba de reproducción", 2024, 15, "Director Test");
        dvdCorto.reproducir();
        
        // 6. Acceder a propiedades específicas
        System.out.println("\n\n7. PROPIEDADES ESPECÍFICAS:");
        System.out.println("----------------------------");
        
        System.out.println("Autor do libro 1: " + libro1.getAutor());
        System.out.println("Páxinas do libro 1: " + libro1.getNumeroPaginas());
        System.out.println("Edición da revista 1: " + revista1.getNumeroEdicion());
        System.out.println("Mes de publicación da revista 1: " + revista1.getMesPublicacion());
        System.out.println("Duración do DVD 1: " + dvd1.getDuracionMinutos() + " minutos");
        System.out.println("Director do DVD 1: " + dvd1.getDirector());
        
        System.out.println("\n=== FIN DA DEMOSTRACIÓN ===");
    }
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://educacion.gitbook.io/programacion/exercicios-java/ud4-solucions/herdanza.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
