Como passar parâmetros por referência?

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.

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

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

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.

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);
   }
}

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.

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.


   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);
        
        

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); 
        

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!!

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!![/quote]

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:

[quote=“growth”]Fui infeliz no exemplo que forneci.
Eu realmente preciso do retorno do parâmetro do método e do retorno do método.
[/quote]
Pra que você vai retornar o próprio i?