Como passar parâmetros por referência?

11 respostas
G

Bom dia a todos.

Em C# existem as notações “ref” e “out”, como no exemplo abaixo:

private int ExtractField(ref string szMsg, string szStart, out string szText, string szEnd)

onde “ref” significa que o parâmetro é uma referência e out que o parâmetro é mais um retorno do método.

Como faço para construir um método em java com essas mesmas características?

Obrigado.

Arnaldo.

11 Respostas

S

Em Java todos os parametros são passados por valor.

J

Basicamente, isso não existe em Java, como já foi dito, todos os parametros são passados por valor!

S

Lembrado que quando vc passa um primitivo por parametro… vc passa os bits equivalentes ao valor desse primitivo…
Agora com Objetos vc passa os bits equivalentes a referencia desse Objeto.

L

O out da para vc fazer uma gambiarra (que por sinal nunca senti necessidade de fazer ehehe é meio feinho). Como o sakurai disse, para objetos é passado a referencia dele, logo eles apontam para mesma regiao de memoria (tipo ponteiro la no c) e se vc alterar um atributo desse objeto, vai alterar ele em toda parte (então vc pode usar o atributo com o out “xunxado”). Da uma olhada no exemplo abaixo, no método ‘a’ o parâmetro pode servir como um out a mais porque altera o atributo na referencia que foi passado, ja o método ‘b’ não serve, porque ele não altera o atributo na mesma referencia do objeto criado no main (e passado por parâmetro). Eu nunca estudei a fundo, mas esse deve ser um dos motivos que aconselham não se alterar atributos de objetos passados por parâmetro :stuck_out_tongue:

public class Teste
{
   public String valor;

   public static int a(Teste x)
   {
      x.valor = "alterado em a";
      return 1;
   }

   public static int b(Teste x) {
      x = new Teste();
      x.valor = "alterado em b";
      return 2;
   }
   
   public static void main(String args[])
   {
      Teste x = new Teste();
      x.valor = "sem valor";
      int y = a(x);
      System.out.println("valor: " + x.valor + " - retorno do método:" + y);
      
      int z = b(x);
      System.out.println("valor: " + x.valor + " - retorno do método: " + z);
   }
}
G

Olá.

Vou passar um exemplo do que quero fazer:

public static void TestaRef (String sTeste, int i)
      {
        switch (i)
        {
          case 1: sTeste = "alteração 1";
          break;
          case 2: sTeste = "alteração 2";
          break;
          case 3: sTeste = "alteração 3";
          break;
          
        }
        
      }
    
    
    public static void main( String[] args )
      {
        
        String sAux = new String("nao alterou");
        TestaRef(sAux, 1);
        System.out.println (sAux);
        TestaRef(sAux, 2);
        System.out.println (sAux);
        TestaRef(sAux, 3);
        System.out.println (sAux);

Como eu faço para que meu método TestaRef altere a string sAux ?

Do jeito que o código está não funciona. A string sAux fica sempre com
“nao alterou”.

Obrigado.

L

Ah, da uma lida ali encima, acho que vc tem que fazer uma gambiarra daquelas, porque não da para alterar o atributo value do objeto String, o value ele é final… se tivesse um método como setValue, vc executaria dentro do seu método para a referencia do objeto String recebido por parâmetro e ai funcionaria, mas no seu caso qdo vc faz sTeste = “Alteração 1” é o mesmo que fazer sTeste = new String(“Alteração 1”), logo criou uma string nova na memoria e não alterou o valor da string que esta na região de memoria de sAux do main.

Não sei se fui claro, mas é isso ai.

S
public static String TestaRef (String sTeste, int i)
      {
        String s = "";
        switch (i)
        {
          case 1: s = "alteração 1";
          break;
          case 2: s = "alteração 2";
          break;
          case 3: s = "alteração 3";
          break;
          
        }
        return s;
        
      }
    
    
    public static void main( String[] args )
      {
        
        String sAux = new String("nao alterou");
        sAux = TestaRef(sAux, 1);
        System.out.println (sAux);
        sAux = TestaRef(sAux, 2);
        System.out.println (sAux);
        sAux = TestaRef(sAux, 3);
        System.out.println (sAux);
G

Fui infeliz no exemplo que forneci.

Eu realmente preciso do retorno do parâmetro do método e do retorno do método.

Seria algo assim:

public static int TestaRef (String sTeste, int i) 
      { 
         switch (i) 
        { 
          case 1: sTeste = "alteração 1"; 
          break; 
          case 2: sTeste = "alteração 2"; 
          break; 
          case 3: sTeste = "alteração 3"; 
          break; 
          
        } 
        return i; 
        
      } 
    
    
    public static void main( String[] args ) 
      { 
        
        int iRet;

        String sAux = new String("nao alterou"); 
        iRet= TestaRef(sAux, 1); 
        System.out.println (sAux); 
        iRet= TestaRef(sAux, 2); 
        System.out.println (sAux); 
        iRet= TestaRef(sAux, 3); 
        System.out.println (sAux);
C

Kra…
SOMENTE os tipos primitivos são passados por VALOR, mas quando tu se refere a OBJETOS, 100% dos objetos são passados por REFERÊNCIA!
E olha q isso caia na SCJP EM!!

E

Kra…
SOMENTE os tipos primitivos são passados por VALOR, mas quando tu se refere a OBJETOS, 100% dos objetos são passados por REFERÊNCIA!
E olha q isso caia na SCJP EM!!

cara realmente é assim mesmo, a passagem de parametros são
por valor apenas para os tipos primitivos… os objetos são passados
por referência…

qualquer duvida basta pegar o codigo e debugar…
será visto claramente que isto ocorre de fato no java… :roll:

S

“growth”:
Fui infeliz no exemplo que forneci.
Eu realmente preciso do retorno do parâmetro do método e do retorno do método.

Pra que você vai retornar o próprio i?

Criado 4 de outubro de 2006
Ultima resposta 5 de out. de 2006
Respostas 11
Participantes 7