Este código Java:
public class XYZ {
public static void main(){
int toyNumber = 5;
XYZ temp = new XYZ();
temp.play(toyNumber);
System.out.println("Toy number in main " + toyNumber);
}
void play(int toyNumber){
System.out.println("Toy number in play " + toyNumber);
toyNumber++;
System.out.println("Toy number in play after increement " + toyNumber);
}
}
irá gerar este:
Número do brinquedo em jogo 5 Número do brinquedo em jogo após o incremento 6 Número do brinquedo no 5 principal
Em C ++, posso passar a toyNumber
variável como passagem por referência para evitar sombras, ou seja, criar uma cópia da mesma variável como abaixo:
void main(){
int toyNumber = 5;
play(toyNumber);
cout << "Toy number in main " << toyNumber << endl;
}
void play(int &toyNumber){
cout << "Toy number in play " << toyNumber << endl;
toyNumber++;
cout << "Toy number in play after increement " << toyNumber << endl;
}
e a saída C ++ será esta:
Número do brinquedo em jogo 5 Número do brinquedo em jogo após o incremento 6 Número do brinquedo no 6 principal
Minha pergunta é - Qual é o código equivalente em Java para obter a mesma saída que o código C ++, visto que Java é passado por valor em vez de por referência ?
java
pass-by-reference
Aluna
fonte
fonte
toyNumber
variável declarada nomain
método não está no escopo doplay
método. O sombreamento em C ++ e Java só acontece quando há aninhamento de escopos. Consulte en.wikipedia.org/wiki/Variable_shadowing .Respostas:
Você tem várias opções. O que faz mais sentido realmente depende do que você está tentando fazer.
Escolha 1: torne toyNumber uma variável de membro público em uma classe
em seguida, passe uma referência a um MyToy para o seu método.
Opção 2: retornar o valor em vez de passar por referência
Essa escolha exigiria uma pequena alteração no call center em principal para que fosse
toyNumber = temp.play(toyNumber);
,.Escolha 3: torne-o uma classe ou variável estática
Se as duas funções forem métodos na mesma classe ou instância de classe, você pode converter toyNumber em uma variável de membro de classe.
Opção 4: crie uma única matriz de elemento do tipo int e passe-a
Isso é considerado um hack, mas às vezes é empregado para retornar valores de invocações de classes embutidas.
fonte
toyNumber = temp.play(toyNumber);
para que funcione como desejado.Java não é chamada por referência , é chamada apenas por valor
Mas todas as variáveis do tipo de objeto são, na verdade, ponteiros.
Então, se você usar um objeto mutável, você verá o comportamento que deseja
Saída deste código:
Você pode ver esse comportamento nas bibliotecas padrão também. Por exemplo Collections.sort (); Coleções.shuffle (); Esses métodos não retornam uma nova lista, mas modificam seu objeto de argumento.
Saída deste código:
fonte
play
; por exemplomutableList[0] = mutableList[0] + 1;
. Como sugere Ernest Friedman-Hill.private static void play(StringBuilder toyNumber)
- como você o chama se for, por exemplo, público estático int que retorna um inteiro? Porque tenho um método que retorna um número, mas se eu não ligar para ele em algum lugar, ele não está em uso.Faça um
em seguida, passe uma referência a uma instância dele. Observe que é melhor evitar um método que altera o estado por meio de seus argumentos, especialmente em código paralelo.
fonte
Você não pode passar primitivos por referência em Java. Todas as variáveis do tipo de objeto são, na verdade, ponteiros, é claro, mas as chamamos de "referências" e também são sempre passadas por valor.
Em uma situação em que você realmente precisa passar um primitivo por referência, o que as pessoas às vezes farão é declarar o parâmetro como um array do tipo primitivo e, em seguida, passar um array de um único elemento como argumento. Então você passa uma referência int [1], e no método, você pode mudar o conteúdo do array.
fonte
Para uma solução rápida, você pode usar AtomicInteger ou qualquer uma das variáveis atômicas que permitem alterar o valor dentro do método usando os métodos embutidos. Aqui está o código de amostra:
Resultado:
fonte
fonte