Detalhes sobre herança

7 respostas
N

opa…

to aqui estudando pra certificação no site www.javaranch.com (muito bom por sinal). Tô bem longe d poder fazer a prova, mas enfim… Tem lá um joguinho q vc tem q responder as perguntas para colocar as vacas no celeiro… euaehuae bem engraçado…

Errei uma pergunta e eu queria tirar uma dúvida… a pergunta é:

Cass Y is subclass of class X. Will this compile?

Y myY = new Y();

X myX = my X;

Eu achava q, não, mas pode e o motivo é:

Any object can always be referenced by a variable which is of superclass type… becouse the child/subclass object is guaranteed to have the methods of the superclass.

Mas se a subclasse tiver um método a mais? o objeto myX vai ter esse método? pq?

por exemplo:

class X {
   metodo1() {
      // xxxx 
   }
}

class Y extends X {
   metodo2() {
      // yyyyyyyy
   }
}

Valeu!

7 Respostas

J

Oi

Neto não entendi a segunda linha, pq o my está separado do X ???

Não seria

X myX = myY; ou
X myX = new Y();

:?

T+

N

pq eu escrevi errado! er…

Cass Y is subclass of class X. Will this compile?

Y myY = new Y();

X myX = myY;
M

isso não seria um exemplo de poliformismo? :?: :?: :?:

J

Tudo bem Neto?

class X {

metodo1() {

// xxxx

}

}
class Y extends X {

metodo2() {

// yyyyyyyy

}

}
Cass Y is subclass of class X. Will this compile?

Y myY = new Y();

X myX = myY;

Muito bem… analisando as duas classes independente da pergunta, podemos perceber que a classe X é uma superclasse (pois é herdade de Y), consequentemente Y é subclasse de X (pois herda a classe X). Portanto, Y é subclasse da classe X (conforme afirmado corretamente na pergunta).
O código abaixo da pergunta é válido, pois toda “referência” de superclasse pode receber referência de subclasse (o que está acontecendo no exemplo), mas o contrário não é verdadeiro (pode através de cast, se pertencer a hierarquia).

Vc pergunto se: Mas se a subclasse tiver um método a mais? o objeto myX vai ter esse método? pq?.

Falando de uma maneira fácil, se a subclasse tiver quantos métodos for necessários, o objeto myX não vai ter esse método, mas como ele pode receber uma referência de subclasse o objeto vai “saber” que ele contém uma instância de um objeto myY e consequentemente todas suas funcionalidades.

Espero ter ajudado…

Até mais.

N

Entendi…

Acho q estou com os vícios de C ainda. Achei q não tinha sentido pq em C, se vc tem uma estrutura q tem um campo X outra estrutura com um campo Y, mesmo q elas sejam iguais, a referência de uma não pode virar outra… tipo, um ponteiro pra X, é pra X… se vc quiser compiar tem q copiar campo por campo… mas blz. Obrigado.

R

O objeto myX saberá que está referenciando um objeto myY, mas não poderá chamar o metodo2(). myX somente poderá chamar este método se ele for declarado na classe X. Este é o princípio do polimorfismo.

ok?

J

hehehehe

É o seguinte, vamos ao velho exemplo de OO.

Classe Pessoa e duas especializações dessa classe Juliano e Neto.

Juliano eu = new Juliano();

Pessoa p = eu;

Neto vc = new Pessoa();

Agora vamos linha por linha…
a primeira linha sem segredos… a segunda linha funciona pq?!
Pq eu herdando de pessoa posso ser assigned para uma Pessoa, porém uma Pessoa qualquer não terá o m’todo implementado comprarFerrari() (dentro da classe Juliano), pois nem todos são ricos como o Juliano =)
ou seja, o objeto p terá acesso a todos os métodos que uma pessoa normal tem acesso, porém não ao que um Juliano tem acesso.

Na terceira linha não funciona pq?! Pq uma Pessoa nãoo tem os métodos que um Neto precisa, como por exemplo, comprarPorche(). ou seja, vc não pode assign um objeto Pessoa a um objeto Neto, pois este objeto p não tem os métodos que vc precisa… ou vc gostaria de sair no prejuizo?!
haiuehiauehaiuh

Espero ter ajudado!

Abraços!

Criado 27 de novembro de 2003
Ultima resposta 6 de jan. de 2005
Respostas 7
Participantes 6