Tá, vou tentar te explicar:
class A {
String nome;
String getNome() ...
}
class B {
String nome;
String getNome() ...
}
se vc faz um new A(), vai ser criado um objeto que contém isso na memoria:
- atributo nome
- método getNome()
se vc faz um new B(), vai ser criado um objeto que contém isso na memoria:
- atributo nome (de A)
- atributo nome (de B)
- método getNome()
Repare que B tem dois atributos ‘nome’. Tendo uma variavel do tipo A, vc só pode ver/acessar as coisas que o A ve, ou seja, um método ‘getNome’ e o atributo ‘nome’ de A. Quando vc faz A = new B(), vc tah dizendo: “olha, eu to criando um objeto B na memória, mas eu só quero ter acesso as coisas que A pode ver”. Ou seja, vc vai ter acesso ao atributo ‘nome’ de A e ao método ‘getNome’. Na memória vc tem um objeto B que é referenciado por uma variavel do tipo A, esse objeto B vai ter tudo que B possui, inclusive o atributo ‘nome’ de B, mas esse ‘nome’ de B não é acessivel através de uma variavel do tipo A, mas quando vc executa o ‘getNome’, a jvm vai executar o getNome do objeto que esta em memoria, que é um ‘getNome’ que foi sobrescrito em B (e que só pode ser executado porque é um método sobrescrito de A, que A sabe que existe), e esse ‘getNome’ acessa o atributo ‘nome’ de B, que vc não tem acesso diretamente a partir da variavel do tipo A.
Os métodos vc pode sobrescrever, por isso se executar getNome de uma variavel que referencia um objeto do tipo B, ele vai executar o getNome de B, já atributos não podem.
Para vc ver que o que tá na memoria é mesmo um objeto B, experimenta fazer um casting para B da variavel A:
class A {
public String valor = "A";
}
class B extends A {
public String valor = "B";
}
public static void main(String[] args) {
A a = new B();
System.out.println(a.valor);
System.out.println(((B) a).valor); //aqui mostra o valor de B
}
ai sim, vc tah acessando o objeto em mémoria através de uma variavel que é do tipo B.
Seu problema é o mesmo que desse tópico, é uma coisa simples, mas parece que muita gente se confunde, e o pior, eu pelo menos acho dificil de explicar de uma forma didática para alguém que tá começando =/
http://www.portaljava.com/home/modules.php?name=Forums&file=viewtopic&t=38982