Boa tarde a todos.
[quote=gRoOve][quote=discorpio]a referência sempre será da Classe A, porque ela é do tipo classe A, que invocará o método foo() da classe que lança a exceção. A menos, é claro que voce declare uma instância como sendo do tipo SubB2 e a instancie com a classe A fazendo o casting para (SubB2), senão vejamos.
[/quote]
Pelo que li no livro da Kathy, apesar de a referência ser da Classe A, a JVM seleciona dinamicamente o método do objeto instanciado, independente da referência.
Deixa eu tentar entender então, independente de eu ter declarado o throws Exception no método da classe Pai e ter sobrescrito este método na classe filha, a cláusula throws vai junto para o método sobrescrito apesar de eu não declarar isto? Fiquei confuso agora…[/quote]
Negativo, o método sobrescrito, substitui todo o código do método da classe pai, passando ser ele o método atual da classe filha, caso voce queira acrescentar o conteúdo de processamento da classe pai para dentro do método sobrescrito na classe filha, voce tem que utilizar a cláusula “super.foo()”, desta forma:
class A {
void foo() throws Exception {
throw new Exception();
}
}
class SubB2 extends A {
@Override
void foo () {
/* Com super voce esta incluindo a implementação do metodo foo() da classe A,
incluindo o lançamento da Exceção. */
super.foo();
System.out.println("B");
}
}
Explicando melhor o que livro da Kathy quer dizer:
Na declaração:
A a = new SubB2();
O JVM analise o objeto a ser instanciado e verificar que são de classes diferentes, a primeira verificação que ele faz é saber se uma classe herda da outra, depois ele verifica qual é o tipo da instância e seleciona dinamicamente os métodos do tipo da instância e não da classe que está sendo instanciada, e é por isso que existe sempre a necessidade de casting (conversão de classes). Além disso, a seleção dinâmica consegue identificar o método que foi sobrescrito através da anotação “Override”.
E lembre-se do que eu disse, pois Classes Pai não consegue enxergar métodos de classes filhas, somente o inverso é possível (filho não gera o seu pai, somente pais geram seus filhos). Por isso, não adianta voce tentar instaciar uma classe Pai que suas classes filhas.