Posso passar parâmetros por referência em Java?

Eu gostaria de semântica semelhante à palavra-chave ref C# .

Java é confuso porque tudo é passado por valor . No entanto, para um parâmetro de tipo de referência (ou seja, não um parâmetro do tipo primitivo) é a própria referência que é passada por valor, portanto, parece ser passagem por referência (e as pessoas costumam afirmar que é). Esse não é o caso, conforme mostrado pelo seguinte:

 Object o = "Hello"; mutate(o) System.out.println(o); private void mutate(Object o) { o = "Goodbye"; } //NOT THE SAME o! 

Vai imprimir Hello para o console. As opções, se você quiser que o código acima seja impresso. Goodbye use uma referência explícita da seguinte maneira:

 AtomicReference ref = new AtomicReference("Hello"); mutate(ref); System.out.println(ref.get()); //Goodbye! private void mutate(AtomicReference ref) { ref.set("Goodbye"); } 

Posso passar parâmetros por referência em Java?

Não.

Por quê ? Java tem apenas um modo de passar argumentos para methods: por valor.

Nota:

Para primitivos isso é fácil de entender: você obtém uma cópia do valor.

Para todos os outros, você obtém uma cópia da referência e isso também é chamado de passagem por valor.

Está tudo nesta foto:

insira a descrição da imagem aqui

Em Java não há nada no nível da linguagem semelhante ao ref . Em Java há apenas passando por valor semântico

Por uma questão de curiosidade, você pode implementar uma semântica semelhante a uma ref em Java simplesmente envolvendo seus objects em uma class mutável:

 public class Ref { private T value; public Ref(T value) { this.value = value; } public T get() { return value; } public void set(T anotherValue) { value = anotherValue; } @Override public String toString() { return value.toString(); } @Override public boolean equals(Object obj) { return value.equals(obj); } @Override public int hashCode() { return value.hashCode(); } } 

caso de teste:

 public void changeRef(Ref ref) { ref.set("bbb"); } // ... Ref ref = new Ref("aaa"); changeRef(ref); System.out.println(ref); // prints "bbb" 

De James Gosling em “The Java Programming Language”:

“… Existe exatamente um modo de passagem de parâmetros em Java – passar por valor – e isso mantém as coisas simples …”

Eu não acho que você possa. Sua melhor opção pode ser encapsular a coisa que você deseja passar “por ref” para outra instância de class e passar a referência da class (externa) (por valor). Se você ver o que eu quero dizer …

ou seja, o seu método altera o estado interno do object para o qual foi passado, o que é visível para o chamador.

Java é sempre passar por valor.

Quando você passa uma primitiva é uma cópia do valor, quando você passa um object é uma cópia do ponteiro de referência.

Outra opção é usar uma matriz, por exemplo, void method(SomeClass[] v) { v[0] = ...; } void method(SomeClass[] v) { v[0] = ...; } mas 1) a matriz deve ser inicializada antes do método ser chamado, 2) ainda não é possível implementar, por exemplo, o método swap dessa maneira … Desta forma, é usado no JDK, por exemplo, em java.util.concurrent.atomic.AtomicMarkableReference.get(boolean[]) .