-----Original Message-----
From: Fl�vio Leite [mailto:[EMAIL PROTECTED]]
Sent: quarta-feira, 17 de outubro de 2001 12:16
To: Java-List@Soujava. Org. Br
Subject: [java-list] Pergunta cruel

Pessoal,
 
Recebi de um colega uma pergunta te�rica sobre o Java muito intrigante como n�o consegui ajuda-lo pensei em vcs da lista. � muito v�lido saber um pouco mais sobre a teoria atr�s do Java. Segue a pergunta:
 
No Java caso um atributo de uma classe base seja redefinido com outro tipo em uma classe derivada, as duas "vers�es" estar�o presentes em inst�ncias da classe derivada, embora a vers�o original esteja oculta.Al�m disso, quando temos um atributo privado na classe base,este n�o � acess�vel em m�todos da classe derivada, mas continua presente em suas inst�ncias (h� quem diga que ele "n�o � herdado"). Explique qual a raz�o da presen�a, aparentemente in�til, desses atributos.
 
[]s,
Fl�vio.
 
 
 
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 varivel i declarada na classe A s� pode ser acessada por um mtodo
 da subclasse B atrves 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 diferena entre invocar um metodo de instncia 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.
 
 

Luiz Cesar H. Kuriki

Responder a