No caso
de uma atributo privado definido na superclasse, o atributo �
v�lido somente
dentro do escopo da superclasse, n�o sendo
poss�vel acess�-la na subclasse.
Quando uma subclasse redefine um atributo n�o
privado da superclasse, com o mesmo tipo ou outro
diferente, o
atributo da superclasse e' sobreposto (shadowing)
pelo atributo da
subclasse. Isto impede que o atributo da superclasse possa ser acessado
simplesmente pelo seu nome, evitando ambiguidade. Veja o exemplo
abaixo:
class A {
public int
i=1; (1)
public void
doSomething() {
System.out.println(i +
i);
}
}
class B extends A
{
public int i=2; (2)
public void
doSomething() {
System.out.println(super.i +
i); (3)
}
}
public class Client
{
public static void main(String[] args)
{
B b = new B();
A a =
b;
b.doSomething(); (4)
a.doSomething(); (5)
System.out.println("b.i="
+ b.i); (6)
System.out.println("a.i=" +
a.i); (7)
}
}
Saida do
programa:
3
3
b.i=2
a.i=1
Desta forma, a vari�vel i declarada na classe A s� pode ser acessada por um m�todo
da subclasse B atr�ves da palavra chave super, como em (3).
Claro, se fosse a variavel
em (1) fosse estatica, ela poderia ser
acessada atraves da forma
<nome da superclasse>.<nome da
variavel> .
� importante notar a diferen�a entre invocar um metodo de inst�ncia em um objeto, como em
(4) e
(5), e acessar variaveis de instancia, como em (6) e (7). Quando um metodo e'
invocado
em um objeto usando uma referencia, e' a classe corrente 'a
qual o objeto pertence, nao o
tipo da referencia, que determina qual
implementacao do metodo vai ser executada. Quando uma
variavel de
instancia e' acessada atraves de uma referencia, e' o tipo da referencia, e
nao a
classe corrente do objeto, que determina qual variavel sera'
acessada.