Achei q nao tinha mais duvidas com relação a herança quando errei uma questão em que:
a classe A tem variaveis de instancia int x = 5.
a classe B estende A e tb declara variavel int x = 7 ( 1o: nao sabia q podia re-declarar a variavel ja que B recebe de A a variavel x.)
e se tu cria um objeto B mas com variável de refencia A, quando tu printa x ele escreve o valor da referencia e nao do objeto, no caso 5.
sim! Ele vai sempre chamar primeiro da referencia ate pq as variaveis nao sao subscritas por isso que acontece isso! nao há relacao entre a variavel x de A e de B. Apenas uma pura semelhança que há variaveis com o mesmo nome nas classes.
É só você lembrar do seguinte: Não existe herança de variáveis de instância (nem sobrescrita). O que existe é a possibilidade das classes filhas terem acesso as variáveis de instância da classe mãe (se o modificador de acesso da variável permitir), mas elas não são herdadas, as variáveis de instância são sempre da classe que a declarou!
Quando você declara uma variável de instância em uma classe filha com o mesmo nome de uma da classe mãe, você está usando uma técnica chamada shadowing.
Esse código é simplinho de tudo, mas ajuda a fixar:
package br.com.kym.testes;
class A {
int x = 10;
}
class B extends A {
int x = 20;
void testaX(int x) {
// Shadowing, variáveis com o mesmo nome
System.out.println(x);
System.out.println(this.x);
System.out.println(super.x);
}
}
public class TestaHeranca {
public static void main(String[] args) {
A a = new B();
System.out.println(a.x); // Imprime 10, "x" de "A"
B b = new B();
System.out.println(b.x); // Imprime 20, "x" de "B"
b.testaX(30);
// Imprime 30 (argumento), 20 (x de B), 10 (x de A)
}
}
Resumindo: Quando você ver uma impressão ou uso de uma variável de instância, sempre olhe para o tipo da referência.
boa, saquei!!
na verdade eu achei q quando que se herdava as variaveis de instancia, na verdade qm estende só tem acesso a variavel de instancia da superclasse …