Bom dia rafaspimenta, [quote]1. Declarar um objeto do tipo ClassePai e instancia-lo com a ClasseFilha. [/quote]
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 …
Na prática, faz toda a diferença na maneira que você usa o objeto. Por exemplo:
class Pai { void metodoPai(){ System.out.println("Classe pai"); } }
class Filha extends Pai { void metodoFilha(){ System.out.println("Classe filha"); } }
class Main{
void main(){
Pai p = new Filha();
Filha f = p;
f.metodoPai(); //OK
f.metodoFilha(); //OK
p.metodoPai(); //OK
p.metodoFilha() //PAAAAAAUUUU .....
}
}
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.
Olá, rmendes08!
Isso eu tenho que entender também, então não tem diferença entre esse dois caso?
[code]Pai p = new Filha();
Pai p2 = new Pai();[/code]
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?
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:
[code]public class TestInherited{
public static void main(){
Filha ff = new Filha();
Pai pf = new Filha();
ff.metodoPai(); //OK
ff.metodoFilha(); //OK
pf.metodoPai(); //OK
pf.metodoFilha(); //The method metodoFilha() is undefined for the type Pai
} [/code]
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?
[quote=Vingdel]Olá, rmendes08!
Isso eu tenho que entender também, então não tem diferença entre esse dois caso?
[code]Pai p = new Filha();
Pai p2 = new Pai();[/code]
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![/quote]
Não, vai funcionar perfeitamente porque o construtor da classe pode acessar qualquer método/membro da classe, seja ele static ou não.
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:
[code]public class TestInherited{
public static void main(){
Filha ff = new Filha();
Pai pf = new Filha();
ff.metodoPai(); //OK
ff.metodoFilha(); //OK
pf.metodoPai(); //OK
pf.metodoFilha(); //The method metodoFilha() is undefined for the type Pai
} [/code]
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?
[/quote]
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.