Duvida na execução

8 respostas
G

Eu tenho o seguinte programa:

1  class A {
  2  public int x, y, z;
  3  public static int s = 1000;
  4  public A(int x, int y, int z) {
  5      this.x = x; this.y = y; this.z = z;
  6  }
  7  public    void mudaX() { x++;}
  8  protected void mudaY() { ++y;}
  9  private  void mudaZ() { ++z;}
10  public void calculaS() {
11      mudaX(); mudaY();  mudaZ();
14      s = x + y + z;
15      
16  }
17 }
18 class B extends A {
19  public int x, y, z;
20  public static int s = 2000;
21  public B(int x, int y, int z){super(x,y,z);}
22  public    void mudaZ() { z += 10;}
23  protected void mudaY() { y += 10;}
24  public  void mudaX() { x += 10;}
25 }
26 public class Redefinicao{
27  public static void main(String args[]) {
28      B b = new B(1, 1, 1); b.calculaS();
30      System.out.println(b.x + " " + b.y + " " + b.z);
31      System.out.println(A.s + " " + B.s);
32  }
33 }

eu fiz o debug dele para tentar entender ele, eu ñ entedi pq quando ele vai executar ele chega na linha 24 vai para 11 executa a 23 vai para 11 e vai para 9, pq ele ñ vai para a 22? ele Ñ deveria ir para a 22 eu ñ entendi essa parte, alguem poderia me dar uma ajuda nessa parte para eu entender a execução desse programa.
Obrigado.

8 Respostas

B

O método mudaZ na classe A tem acesso privado, o que quer dizer que mudaZ da classe B não sobreescreve ao método, é um totalmente independente, mas com mesmo nome.

Como o calculaS é um método de A, e não há sobreescrita de mudaZ em B, ele usa o mudaZ de A mesmo.

Se lá no main tivesse chamado b.mudaZ() direto, aí teria pegado o da linha 22.

G

Então se o CalculaS é da Classe A ele ñ deveria usar o muda X e Y da A ao inves da B?

B

Não, por que esses dois são sobreescritos. A implementação dos métodos que vale é aquela em B. Os métodos de A são “apagados” para aquele objeto quando uma subclasse que os sobreescrevem é instanciada.

Se fosse A a = new A();, ou um A c = new C(); onde este C não sobreescrevesse os métodos, então ele usaria os de A.

pelissoni

Então cara isso seria dessa forma, mas você Herdou os metodos da CLasse A quando fez

class B extends A{}

ela herdou os métodos tambem, o calculaS ta escrito na classe A, como a classe B herda métodos da a ela fez o seguinte quando vc executa b.calculaS
você está dizendo que B é uma A, e vai procurar esse método, ai ele vai usar os atributos da Classe B, se você não quer isso, vc tira o extends A da classe B e instancia um A a = new A(); na classe redefinição

talvez eu tenha deixado meio complicado, qq coisa fala ai, que eu tento explicar melhor

G

Agora com oq vc 2 me explicaram clariou bem mais, eu ja consigui enter ±, mas ai eu fiquei com uma duvida, se ele esta instanciado de B pq na hora de executar a linha 11 ele ñ deveria pegar o Muda x, muda y e muda z de B? só que ele so pego so a linha 23 e 24, a 22 ñ ele vai na classe A e pega a 9 se ele é uma instancia de B mesmo herdando de A ele ñ deveria executar as 22, 23 e 24 da B, a minha duvida agora é pq ele pega o muda Z de A e não o de B

pelissoni

Então cara faz assim …

pega cada uma das Classes e cria um arquivo pra cada uma, e faz assim, os Atributos, vc deixa sempre como PRIVATE, e os Métodos PUBLIC, PROTECTED é o meio termo dos 2, ai vc consegue ter uma visão melhor, foi o que o nosso amigo disse vc deixou um método privado ai ele faz isso que aconteceu com vc.

resumindo evite o uso do protected;
deixe os atributos privados, use getters e setters para pegar/atribuir os valores do mesmo e todos os métodos publicos,
pois assim vc se perde menos, claro que essas regrinhas são aplicaveis dependendo da situação.

qq duvida posta ai

G

Kara vlw pela dica, é q eu estava estudando ai eu me deparei com esse programa q de aparencia era de simples para entender ai quando eu joguei para debugar ele eu fiquei com essa duvida do pq ele pegar um unico metodo da classe A sendo q foi tudo instanciado em B, mas eu vou tentar fazer isso q vc disse para ver. vlw obrigado pela ajuda

pelissoni

opa, qualquer duvida posta ai.

Criado 21 de julho de 2009
Ultima resposta 22 de jul. de 2009
Respostas 8
Participantes 3