Herança

8 respostas
elvishr

Galera, é o seguinte, quando tenho uma superclasse com membros private esses membros não serão herdados na sua subclasse, tudo bem até aí.
Minha dúvida é quando eu tenho um método public que seta o valor de uma variável private na superclasse. O que acontece quando esse método é herdado na subclasse? sendo que a variável membro private não é herdada.

Ex.:

public class Ex {
   private int valor;
   public void setValor(int val) {
      valor = val;
   }
}

public class SubEx extends Ex{
   setValor(5)  // É herdado ??? o que ele faz ???
}

:roll:

8 Respostas

marciolx

Eu também já tive essa dúvida :slight_smile:
Não há problema porque o método public da superclasse acessa a variável private da própria superclasse. Se a variável é dela ela tem acesso, concorda? a subclasse nem precisa saber (e não sabe) o que acontece dentro do método público da superclasse.

elvishr

Não sei se entendi.
Quer dizer então que o método herdado existe, só porque não faz nada, porque a variável private ele nem conhece, qualquer outro código para tratamento de val dentro do método ficaria como?

marciolx

“elvishr”:
Não sei se entendi.
Quer dizer então que o método herdado existe, só porque não faz nada, porque a variável private ele nem conhece, qualquer outro código para tratamento de val dentro do método ficaria como?

Vamos separar as coisas:

1 - Quer dizer que o método setValor é herdado porque ele é public, não interessa o que ele faz.

2 - Quanto à val, ele é um argumento do método e o método pode fazer o que quiser com ele, isso nada tem a ver com acessibilidade ou modificadores de acesso

3 - Quanto à valor, ela é uma variável private da superclasse e qualquer código dentro da superclasse pode ter acesso à ela

marciolx

Este exemplo deixa claro que o atributo valor da superclasse foi modificado:

// SubEx.java

class Ex {
   private int valor;
   public void setValor(int val) {
      valor = val;
   }
   public int getValor() {
      return valor;
   }
}

public class SubEx extends Ex{
    public static void main (String [] args) {
	   SubEx sex = new SubEx();
	   sex.setValor(5);
	   System.out.println(sex.getValor());	   
    }
}

A subclasse não tem acesso ao atributo valor da superclasse, mas os métodos públicos da superclasse (getValor e setValor) têm acesso aos atributos private dela mesma.

elvishr

Humm…
Então é como se eu tivesse acesso a variável da superclasse, só porque somente através dos métodos, quem tem acesso na verdade é o método, e ele seta ela e traz o resultado, a SubEx como subclasse está restrita a somente utilizar os métodos herdados.

Ok, mas desse jeito parece que fica um pouco confuso, se o método é da superclasse, instancio uma subclasse, chamo o método da subclasse e ele muda a variável da superclasse, sem a superclasse instanciada, sem o método ser static…

Desculpe, entendi sua explicação, mas fiquei um pouco confuso agora… :roll:

marciolx

“elvishr”:
Humm…
Então é como se eu tivesse acesso a variável da superclasse, só porque somente através dos métodos, quem tem acesso na verdade é o método, e ele seta ela e traz o resultado, a SubEx como subclasse está restrita a somente utilizar os métodos herdados.

Ok, mas desse jeito parece que fica um pouco confuso, se o método é da superclasse, instancio uma subclasse, chamo o método da subclasse e ele muda a variável da superclasse, sem a superclasse instanciada, sem o método ser static…

Desculpe, entendi sua explicação, mas fiquei um pouco confuso agora… :roll:

ok :slight_smile:

Talvez alguém possa explicar de forma mais clara, eu não sou muito bom nisso.

Mas veja mais ou menos deste modo, a subclasse tem acesso aos métodos públicos da superclasse, não importa o que estes métodos façam. Você instanciou uma subclasse, mas esta subclasse herdou os métodos públicos da superclasse portanto ela tem acesso à estes métodos. O que estes métodos fazem já é outra coisa. Eles mudaram uma variável private de superclasse, mas a subclasse não sabe disso, e nem precisa saber, já que ela está se “comunicando” com a superclasse através de sua interface pública.

O exemplo abaixo funciona do mesmo modo, note que SubEx não é mais subclasse de Ex:

class Ex {
   private int valor;
   public void setValor(int val) {
      valor = val;
   }
   public int getValor() {
      return valor;
   }
}

public class SubEx {
    public static void main (String [] args) {
	   Ex ex = new Ex();
	   ex.setValor(5);
	   System.out.println(ex.getValor());	   
    }
}
elvishr

Entendi melhor agora…

Acho que é coisa da herança mesmo, se o método tem acesso, não importa o que ele faz, dentro do método não entra o conceito de herança, e se o método altera a variável, não importa como, ele tem acesso a isso.

Se estiver errado, me corrijam.

Beleza marcio… Obrigado pela explicação

:smiley:

marciolx

“elvishr”:
Entendi melhor agora…

Acho que é coisa da herança mesmo, se o método tem acesso, não importa o que ele faz, dentro do método não entra o conceito de herança, e se o método altera a variável, não importa como, ele tem acesso a isso.

Se estiver errado, me corrijam.

Beleza marcio… Obrigado pela explicação

:D

é isso mesmo! você tem que enxergar as partes (imagine as 3 telas da matrix cheias do bagulhinho verde caindo) e depois o todo (imagine o Neo voando e tretando com o Agente Smith)
:smiley:

Criado 12 de novembro de 2003
Ultima resposta 12 de nov. de 2003
Respostas 8
Participantes 2