Java의 기본 요소에 대한 참조에 의한 전달과 동등한 작업을 수행하는 방법 System.out.println(“Toy number in main “

이 자바 코드 :

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


답변