Anotações OCJP

Minhas anotações para o exame da Oracle (OCJP)

Definindo passagem de parâmetros em Java

Neste artigo, vamos falar um pouco sobre as referências passadas por parâmetro para o método.

Sabia que existem algumas regras essenciais para a passagem de valores para métodos? Mais ainda, que existem diferenças essenciais entre passar um valor primitivo para um método e passar um objeto para um método?

Veja o exemplo abaixo.

class Pessoa{
  private String nome;
  public void setNome(String nome){
    this.nome = nome;
  }
  public String getNome() {
    return nome;
  }
}

class Referencia{
  public int m(int paramInt){
    paramInt = 20;
    return paramInt;
  }
  public Pessoa m1(Pessoa p){
    p.setNome("Bruno");
    return p;
  }
}

public class TesteReferencias {
  public static void main(String[] args) {
    //passando copia do valor de i para o metodo
    int i = 10;
    Referencia rf = new Referencia();
    System.out.println("Valor retornado: " +rf.m(i));
    System.out.println("Valor de i: " + i);

    //passando copia da referencia do objeto para o objeto
    Pessoa p = new Pessoa();
    p.setNome("Roberto");
    Referencia rf1 = new Referencia();
    System.out.println("Valor retornado: " + ((Pessoa)rf1.m1(p)).getNome());
    System.out.println("Valor de p.nome: " + p.getNome());
  }
}

As duas primeiras linhas da saída podem não ser surpresa:

Valor retornado: 20
Valor de i: 10

Quando se passa um valor de um atributo do tipo primitivo para um método, uma cópia do valor que está neste atributo é passada. Desta forma, qualquer alteração realizada dentro do método será feita em um valor novo, que não tem ligação com o atributo passado por parâmetro.

Já as duas últimas linhas da saída podem surpreender:

Valor retornado: Bruno
Valor de p.nome: Bruno

Quando se passa um objeto para um método, é passada a cópia da referência do objeto para qual a referência está apontando. Desta forma, qualquer alteração realizada através da cópia da referência no objeto será realizada no objeto, uma vez que esta cópia tem relação com o objeto instanciado pela referência copiada.

Porém, preste muita atenção no que foi dito em relação a passagem de parâmetros de objeto para métodos. Lembre-se sempre que é feita uma cópia da referência. Caso esta cópia da referência seja modificada para referenciar um outro objeto, todas as alterações dirão respeito apenas a este outro objeto referenciado. O exemplo abaixo deixará mais claro o que foi dito.

//classe Pessoa
class Referencia{
  //metodos m e m1
  public Pessoa m2(Pessoa p){
    //copia da referencia aponta para novo objeto
    p = new Pessoa();
    p.setNome("Bruno");
    return p;
  }
}

public class TesteReferencias {
  public static void main(String[] args) {
    //instancia de um objeto com nome alessandro, modificacao no metodo m2
    Pessoa p2 = new Pessoa();
    p2.setNome("Alessandro");
    Referencia rf2 = new Referencia();
    System.out.println("Valor retornado: " + ((Pessoa)rf2.m2(p2)).getNome());
    System.out.println("Valor de p2.nome: " +p2.getNome());
  }
}

Seria então uma surpresa o retorno abaixo?

Valor retornado: Bruno
Valor de p2.nome: Alessandro

Descrevendo em detalhes a execução no método main:

1. Foi instanciado um objeto da classe Pessoa.

2. O atributo nome deste objeto é modificado para “Alessandro”

3. A classe referência é instanciada.

4. O método m2 da classe Referencia é chamado, foi passada a cópia da referência do objeto Pessoa anteriormente instanciado.

5. (No método m2) É instanciado um novo objeto da classe Pessoa

5.1 Este objeto é atribuido a referência passada ao método.

6. O atributo nome do novo objeto é modificado para “Bruno”.

7. É retornado este novo objeto pelo método m2.

8. (No método main) O objeto novo é recuperado e o atributo nome é retornado pela chamada a getNome()

9. É impresso na tela:

Valor retornado: Bruno

10. O atributo nome do objeto não modificado da referência p2 é retornado pela chamada a getNome().

11. É impresso na tela:

Valor de p2.nome: Alessandro

Então é isso, bons estudos e até a próxima!

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: