Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Referencia de objetos

Olá pessoal, boa noite!

Digamos que eu tenha uma classe Cachorro que herda da classe Animal e tem o método latir().

public class Animal {
}
public class Cachorro extends Animal{

    public void latir() {
        System.out.println("au au");
    }
}

Sei que poderia chamar normalmente

Cachorro cao = new Cachorro();
cao.latir();

Minha dúvida é: se eu instanciar um novo Cachorro só que do tipo Animal Animal cao1 = new Cachorro(); Porque que não consigo acessar o método latir já que o objeto criado é do tipo Cachorro?

2 respostas
solução!

Olá! A razão pela qual você não pode acessar o método latir() ao utilizar a referência do tipo Animal para um objeto do tipo Cachorro é devido ao conceito de polimorfismo e à natureza da referência em tempo de compilação.

Quando você declara a referência Animal cao1 = new Cachorro();, você está criando uma referência do tipo Animal que aponta para um objeto do tipo Cachorro. Em tempo de compilação, o compilador só conhece os membros (métodos e campos) da classe Animal, mesmo que o objeto real seja do tipo Cachorro. Portanto, a referência cao1 só permite acessar membros da classe Animal.

Para resolver isso, você pode fazer um downcasting, convertendo explicitamente a referência de Animal para Cachorro:

Animal cao1 = new Cachorro();
((Cachorro) cao1).latir();

No entanto, ao usar downcasting, você deve ter cuidado para garantir que o objeto referenciado seja realmente uma instância de Cachorro em tempo de execução, para evitar exceções do tipo ClassCastException. Portanto, é uma boa prática verificar se a conversão é segura usando o operador instanceof:

Animal cao1 = new Cachorro();
if (cao1 instanceof Cachorro) {
    ((Cachorro) cao1).latir();
} else {
    System.out.println("O objeto não é um Cachorro.");
}

Em geral, é aconselhável usar polimorfismo e trabalhar com referências do tipo da superclasse sempre que possível, mas, quando necessário, você pode usar downcasting com cuidado.

Obrigado.