Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida no exercício 3

Alguém pode me explicar exatamente o que significa esse código?

class Animal { // propriedades e métodos comuns }

class Cachorro extends Animal { // propriedades e métodos do cachorro }

public class Main { public static void main(String[] args) { Animal animal = new Cachorro();

    if (animal instanceof Cachorro) {
        Cachorro cachorro = (Cachorro) animal;
        // Agora você pode usar o objeto 'cachorro' como um Cachorro.
    } else {
        System.out.println("O objeto não é um Cachorro.");
    }
}

}

1 resposta
solução!

Vamos imaginar que a classe Animal tem o método dormir e a classe cachorro tem o método latir. Animal é um animal, mas não é um Cachorro, por isso esse objeto só consegue usar o método dormir; Cachorro é um cachorro e também é um Animal, por isso ele consegue usar o método dormir e latir.

Animal animal = new Cachorro() - Cria uma instância de um objeto do tipo Cachorro e guarda numa variável do tipo animal. Como a instância foi guardada num objeto Animal, mesmo ela sendo do tipo Cachorro, fica limitada a usar o método dormir sem poder usar latir.

if (animal instanceof Cachorro) - Verificar se o objeto na variável animal é uma instância de um objeto Cachorro. Caso seja verdadeiro, entra no bloco do if.

Cachorro cachorro = (Cachorro) animal - utiliza um recurso chamado cast para para converter aquela variável animal para o tipo Cachorro. A sintaxe (Cachorro) animal indica ao compilador que você está convertendo explicitamente a referência animal para o tipo Cachorro. Isso significa que você está informando ao compilador que tem certeza de que animal é um Cachorro. Agora que está convertido, podemos usar o método dormir e latir usando a variável cachorro. Se a verificação desse false, cairia no bloco do else, imprimindo a mensage "O objeto não é um Cachorro" no console.

Cachorro cachorro = (Cachorro) animal Esse código só foi possível porque Cachorro e Animal possuem uma relação de herança, ela foi estabelecida quando Cachorro extendeu de Animal.

Aqui vão alguns exemplos:

// Esse código seria impossível, o objeto Animal não é um cachorro. 
Cachorro cachorro = new Animal();

// O contrário é possível pois Cachorro é um objeto Cachorro e um objeto Animal, mas desse jeito não será possível usar o método latir, porque a instância está guardado num tipo Animal
Animal animal = new Cachorro();

// Esse código não seria possível, pois Animal e Planta não têm relação de herança (não faria sentido criar herança entre eles). Um animal não é uma Planta e uma Planta não é um Animal
Animal animal = new Planta();

// As três linhas a seguir seriam possíveis, pois os objetos Planta, Animal e Cachorro com certeza possuem uma relação de herança com objeto SerVivo. Um ser vivo não é uma Planta, nem Animal e nem Cachorro, mas uma Planta é um SerVivo e etc
SerVivo criatura1 = new Planta();
SerVivo criatura2 = new Animal();
SerVivo criatura3 = new Cachorro();

// Novamente um código impossível. Um SerVivo não é uma Planta, mas o contrário é possível pois uma planta é uma Planta e também é um SerVivo
Planta criaturinha = new SerVivo();

Espero ter ajudado. Se foi útil pra você para você, marca como sulução. Bons estudos!