5
respostas

E quanto aos atributos?

Turma,

Supondo que eu tenha a classe mãe "Animal" abaixo:

public class Animal {
    private String olho;
    private String ouvido;
    private String focinho;

//gets e sets
}

Daí eu tenho a classe filha "Cachorro":

public class Cachorro extends Animal {
    private String pelo;
//gets e sets
}

E lá no método main da classe TesteAnimal o polimorfismo:

public static void main(String[] args) {
        Animal a1 = new Cachorro();
}

Como o atributo da classe cachorro (no caso o pelo) não ficará disponível através do getPelo(), existe uma forma de acessar esse atributo? ele ao menos foi criado quando eu chamei o construtor "new Cachorro()" usando a referência "Animal a1"?

5 respostas

Oi Rodrigo, pelo que entendo, ele foi criado sim, visto que o Java vai chamar o construtor específico. Bom, mas como você pode acessar o atributo? A forma mais simples é você fazer um cast para o tipo de referência correto.

Você não vai conseguir fazer um acesso direto assim por causa do tipo da referência. O compilador não vai permitir.

OI Wanderson,

Como ficaria o código para fazer este cast e trocar uma referencia?

Rodrigo,

A primeira parte da sua pergunta eu concordo com o Wanderson, ele cria os atributos do cachorro. Vocë pode ver isso se colocar um sysout no construtor da classe cachorro.

public Cachorro(){
        this.pelo = "Branco";
        this.latido = "Resmungo";
        System.out.println(pelo + " " + latido);

    }

Para fazer o cast e utilizar o atributo da classe cachorro use o seguinte código

((Cachorro)a1).getPelo()

[]s

Isso mesmo Danilo.

Boa noite Rodrigo,

Vamos por parte:

1) Como o atributo da classe cachorro (no caso o pelo) não ficará disponível através do getPelo(), existe uma forma de acessar esse atributo? Resposta: O atributo só poderá ser acessado se você aumentar a visibilidade. Se quiser acessar "pelo" por uma instância da classe Cachorro, defina o atributo "pelo" como public. Por outro lado, se quiser acessá-lo dentro de uma classe filha, defina o atributo como protected. A forma recomendável para acessar externamente atributos de uma classe é por meio de métodos getters (e.g.: getPelo) e setters (e.g.: setPelo).

2) Ele ao menos foi criado quando eu chamei o construtor "new Cachorro()" usando a referência "Animal a1"? Resposta: Sim, porque o atributo foi criado conforme o tipo mais específico, no caso Cachorro. Entretanto, "pelo" não estará acessível fora da classe até que você altere sua visibilidade para public ou protected. Considerando que a visibilidade do atributo "pelo" é private, não tem como acessá-lo de uma instância de Cachorro nem de outras classes.