1. Declarar um objeto do tipo ClassePai e instancia-lo com a ClasseFilha.
Se ClasseFilha estender ClassePai, sem problemas
Neste caso sim, mas acho que vc quis dizer se criar uma referência da classe filha e instanciá-la como pai, não é isso? Se sim, o compilador deixa passar, pois observa na árvore de hierarquias e vê que possue uma descendência, PORÉM, terá um erro em tempo de execução, será lançada uma exceção ClassCastException …
rmendes08
Na prática, faz toda a diferença na maneira que você usa o objeto. Por exemplo:
o que o exemplo mostra é que você pode referenciar um objeto da classe filha por uma variavel do tipo pai, porém, você só consegue executar os métodos da classe pai nesse caso.
Vingdel
Olá, rmendes08!
Isso eu tenho que entender também, então não tem diferença entre esse dois caso?
Pai p = new Filha();
Pai p2 = new Pai();
Mas e se, no primeiro caso, o construtor da classe Filha (afinal ele é o responsável pela no instância), por acaso, fizer uso de um método da classe Filha, vai dar PAAAAAAUUUU?
Abraço!
rafaspimenta
ironmarq:
...acho que vc quis dizer se criar uma referência da classe filha e instanciá-la como pai, não é isso?
Se eu tentar criar uma ref. da classe Filha e instancia-la como Pai, dá o seguinte erro:
Filha fp = new Pai(); //Type mismatch: cannot convert from Pai to Filha
acho que para fazer isso teria que ser através de cast.
Continuando, fiz os seguinte teste:
publicclassTestInherited{publicstaticvoidmain(){Filhaff=newFilha();Paipf=newFilha();ff.metodoPai();//OK ff.metodoFilha();//OK pf.metodoPai();//OK pf.metodoFilha();//The method metodoFilha() is undefined for the type Pai}
Bom, sinceramente n entendi pq o compilador levantou essa excessão.
Achava que por ter instanciado meu objeto pf como Filha, teria acesso a todos métodos da mesma. Alguém pode me explicar?
rmendes08
Vingdel:
Olá, rmendes08!
Isso eu tenho que entender também, então não tem diferença entre esse dois caso?
Pai p = new Filha();
Pai p2 = new Pai();
Mas e se, no primeiro caso, o construtor da classe Filha (afinal ele é o responsável pela no instância), por acaso, fizer uso de um método da classe Filha, vai dar PAAAAAAUUUU?
Abraço!
Não, vai funcionar perfeitamente porque o construtor da classe pode acessar qualquer método/membro da classe, seja ele static ou não.
rmendes08
rafaspimenta:
ironmarq:
...acho que vc quis dizer se criar uma referência da classe filha e instanciá-la como pai, não é isso?
Se eu tentar criar uma ref. da classe Filha e instancia-la como Pai, dá o seguinte erro:
Filha fp = new Pai(); //Type mismatch: cannot convert from Pai to Filha
acho que para fazer isso teria que ser através de cast.
Continuando, fiz os seguinte teste:
publicclassTestInherited{publicstaticvoidmain(){Filhaff=newFilha();Paipf=newFilha();ff.metodoPai();//OK ff.metodoFilha();//OK pf.metodoPai();//OK pf.metodoFilha();//The method metodoFilha() is undefined for the type Pai}
Bom, sinceramente n entendi pq o compilador levantou essa excessão.
Achava que por ter instanciado meu objeto pf como Filha, teria acesso a todos métodos da mesma. Alguém pode me explicar?
Não. O que define o acesso a um método/membro é o tipo da variável, e não o tipo da instância. O tipo da instância por sua vez define a implementação do método que será invocada. À primeira vista isso é uma limitação, mas na prática, aí é que está a mágica do polimorfismo. O fato de você acessar os método de um objeto pelo tipo da variável e não pela implementação permite que você escreva métodos em termos de um contrato de interface sem antes mesmo ter uma classe que a implementa. Um exemplo prático é o JDBC. Praticamente, tudo no JDBC são interfaces e você as usa em termos genéricos. Assim, você pode escrever um programa todo que usa acesso a dados sem se preocupar com as peculiaridades de cada um.