이 자바 코드 :
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);
}
}
다음과 같이 출력됩니다.
놀이 5 장난감 번호 기소 6 이후 놀이 장난감 번호 메인 5의 장난감 번호
C ++에서는 toyNumber
섀도 잉을 방지하기 위해 참조에 의한 전달로 변수를 전달할 수 있습니다. 즉, 아래와 같은 동일한 변수의 복사본을 생성합니다.
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;
}
C ++ 출력은 다음과 같습니다.
놀이 5 장난감 번호 기소 6 이후 놀이 장난감 번호 메인 6의 장난감 번호
내 질문은 -Java가 참조로 전달하는 것이 아니라 값으로 전달되는 경우 C ++ 코드와 동일한 출력을 얻기 위해 Java에서 동등한 코드는 무엇입니까 ?
답변
몇 가지 선택이 있습니다. 가장 의미있는 것은 당신이하려는 일에 달려 있습니다.
선택 1 : toyNumber를 클래스의 공용 멤버 변수로 만들기
class MyToy {
public int toyNumber;
}
그런 다음 MyToy에 대한 참조를 메서드에 전달하십시오.
void play(MyToy toy){
System.out.println("Toy number in play " + toy.toyNumber);
toy.toyNumber++;
System.out.println("Toy number in play after increement " + toy.toyNumber);
}
선택 2 : 참조로 전달하는 대신 값 반환
int play(int toyNumber){
System.out.println("Toy number in play " + toyNumber);
toyNumber++;
System.out.println("Toy number in play after increement " + toyNumber);
return toyNumber
}
이 선택은 main의 callsite를 약간 변경하여 toyNumber = temp.play(toyNumber);
.
선택 3 : 클래스 또는 정적 변수로 만들기
두 함수가 동일한 클래스 또는 클래스 인스턴스의 메서드 인 경우 toyNumber를 클래스 멤버 변수로 변환 할 수 있습니다.
선택 4 : int 유형의 단일 요소 배열을 만들고 전달합니다.
이것은 해킹으로 간주되지만 때때로 인라인 클래스 호출에서 값을 반환하는 데 사용됩니다.
void play(int [] toyNumber){
System.out.println("Toy number in play " + toyNumber[0]);
toyNumber[0]++;
System.out.println("Toy number in play after increement " + toyNumber[0]);
}
답변
자바가 아닌 참조에 의한 호출 이있다 값에 의해 호출은
그러나 객체 유형의 모든 변수는 실제로 포인터입니다.
따라서 Mutable Object를 사용하면 원하는 동작을 볼 수 있습니다.
public class XYZ {
public static void main(String[] arg) {
StringBuilder toyNumber = new StringBuilder("5");
play(toyNumber);
System.out.println("Toy number in main " + toyNumber);
}
private static void play(StringBuilder toyNumber) {
System.out.println("Toy number in play " + toyNumber);
toyNumber.append(" + 1");
System.out.println("Toy number in play after increement " + toyNumber);
}
}
이 코드의 출력 :
run:
Toy number in play 5
Toy number in play after increement 5 + 1
Toy number in main 5 + 1
BUILD SUCCESSFUL (total time: 0 seconds)
표준 라이브러리에서도이 동작을 볼 수 있습니다. 예를 들어 Collections.sort (); Collections.shuffle (); 이 메서드는 새 목록을 반환하지 않지만 인수 개체를 수정합니다.
List<Integer> mutableList = new ArrayList<Integer>();
mutableList.add(1);
mutableList.add(2);
mutableList.add(3);
mutableList.add(4);
mutableList.add(5);
System.out.println(mutableList);
Collections.shuffle(mutableList);
System.out.println(mutableList);
Collections.sort(mutableList);
System.out.println(mutableList);
이 코드의 출력 :
run:
[1, 2, 3, 4, 5]
[3, 4, 1, 5, 2]
[1, 2, 3, 4, 5]
BUILD SUCCESSFUL (total time: 0 seconds)
답변
을 만들다
class PassMeByRef { public int theValue; }
그런 다음 인스턴스에 대한 참조를 전달하십시오. 인수를 통해 상태를 변경하는 메서드는 특히 병렬 코드에서 피하는 것이 가장 좋습니다.
답변
Java에서 참조로 기본 요소를 전달할 수 없습니다. 물론 객체 유형의 모든 변수는 실제로 포인터이지만 “참조”라고 부르며 항상 값으로 전달됩니다.
참조로 기본 요소를 전달해야하는 상황에서 사람들은 매개 변수를 기본 유형의 배열로 선언 한 다음 단일 요소 배열을 인수로 전달하는 경우가 있습니다. 따라서 참조 int [1]을 전달하고 메서드에서 배열의 내용을 변경할 수 있습니다.
답변
빠른 솔루션을 위해 AtomicInteger 또는 내장 된 메서드를 사용하여 메서드 내부의 값을 변경할 수있는 원자 변수를 사용할 수 있습니다. 다음은 샘플 코드입니다.
import java.util.concurrent.atomic.AtomicInteger;
public class PrimitivePassByReferenceSample {
/**
* @param args
*/
public static void main(String[] args) {
AtomicInteger myNumber = new AtomicInteger(0);
System.out.println("MyNumber before method Call:" + myNumber.get());
PrimitivePassByReferenceSample temp = new PrimitivePassByReferenceSample() ;
temp.changeMyNumber(myNumber);
System.out.println("MyNumber After method Call:" + myNumber.get());
}
void changeMyNumber(AtomicInteger myNumber) {
myNumber.getAndSet(100);
}
}
산출:
MyNumber before method Call:0
MyNumber After method Call:100
답변
public static void main(String[] args) {
int[] toyNumber = new int[] {5};
NewClass temp = new NewClass();
temp.play(toyNumber);
System.out.println("Toy number in main " + toyNumber[0]);
}
void play(int[] toyNumber){
System.out.println("Toy number in play " + toyNumber[0]);
toyNumber[0]++;
System.out.println("Toy number in play after increement " + toyNumber[0]);
}