Dúvida sobre herança e reescrita de atributo

6 respostas
danielbussade
public class Principal {   
  public static void main ( String args[] ) {   
    Classe2 n=new Classe2();   
 
    System.out.println(n.getNum1());   
  
  }   
}   
  
class Classe1 {   
  protected int num1=1;   
  
  public int getNum1() {   
    return num1;   
  }   
}   
  
class Classe2 extends Classe1 {   
  protected int num1=2;   
}

Alguem pode me explicar porque o resultado deste programa é 1? Tudo bem eu não reescrevi o método na Classe2 mas reescrevi o atributo então quando herdei da Classe1 o metodo getNum1 foi pra “dentro” da Classe2, que tinha o atributo num1 que era =2, então porque ele não retornou este??
Podem me esclarecer melhor!!

Obrigado!!

6 Respostas

GiancarloBraga

Você simplesmente está criando um objeto da classe 2. Certo?

Então você usa a referência a esse objeto através da variável ‘n’.

Esse ‘n’ vai acessar um método da classe 2, que herda tudo da classe 1. Ou seja, falamos do método getNum1(). Esse método, usado para pegar a variável ‘num1’, corresponderá ao escopo da classe2. E não mais da classe 1, pois dentro da 2 você sobrepôs essa variável ‘num1’.

danielbussade

Esse método, usado para pegar a variável ‘num1’, corresponderá ao escopo da classe2. E não mais da classe 1, pois dentro da 2 você sobrepôs essa variável ‘num1’.

Então Giancarlo eu sobrepôs a variavel num1 na classe2 e atribui a ela o valor 2, só que este programa me retorna 1 que é o valor da varíavel definida no escopo da Classe1.

Porquee, ele retorna este valor???

Obrigado

GiancarloBraga

Ah, ele está retornando 1?
Uai.
Então analisei errado(na pressa).
Me desculpe.

Então, creio que nesse caso de herança então não tenha essa de atribuição. Quando você invoca o método getNum1 ele pertence ao escopo da classe Num1, onde o valor dessa mesma variável é 1, por isso retorno 1.

Bernini

@danielbussade

Você deveria alterar, através de um método, o valor do atributo num1.
Como o atributo é protected, por regra da OO ele só pode ser acessado através de métodos da superclasse ou subclasse.
Segue um exemplo:

public class Principal {   
  public static void main ( String args[] ) {   
    Classe2 n=new Classe2();
	n.alteraNum1(2);
    System.out.println(n.getNum1());   
   }   
}   
 class Classe1 {   
  protected int num1=1; 

  public int getNum1() {   
    return num1;   
  }   
} 
class Classe2 extends Classe1 {   
    public int alteraNum1(int valor) {
		num1 = valor;
		return num1;
	}  
}
jonatan0573

Na minha opinião o correto seria reescrever o metodo e eu usaria tb polimorfismo( no caso de vc querer adicionar mais alguma funcionalidade a sua classe, no futuro ). esse atributo da Classe2 tb seria excluido, pois já existe esse msm atributo na Classe1.

se for necessario posto o codigo…

edmarr

Resumindo
se vc tivesse o codigo ;

lass Classe2 extends Classe1 { protected int num1=2; public void getNum1(){ return num1; } }

Dai então vc receberia o valor que vc estava imaginando , ou seja
como vc ta extendendo uma classe , ela simplesmente vai subir a hierarquia para poder verificar se existe o método antes de lançar uma Exception.

Criado 28 de outubro de 2007
Ultima resposta 10 de set. de 2009
Respostas 6
Participantes 5