> Java > java지도 시간 > Java에서 프리미티브에 대한 참조별 전달 효과를 어떻게 달성합니까?

Java에서 프리미티브에 대한 참조별 전달 효과를 어떻게 달성합니까?

Mary-Kate Olsen
풀어 주다: 2024-11-12 22:15:03
원래의
994명이 탐색했습니다.

How Do You Achieve a Pass-by-Reference Effect for Primitives in Java?

프리미티브에 대한 참조에 의한 전달과 동일한 Java

C에서 참조에 의한 전달을 사용하면 함수가 범위 외부의 변수를 수정할 수 있습니다. 그러나 Java는 값 전달 방식으로 작동하므로 기본 요소에 대해 동일한 효과를 얻기가 어렵습니다.

다음 코드를 고려하세요.

public class XYZ {
    public static void main(String[] args) {
        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 increment " + toyNumber);
    }
}
로그인 후 복사

이 코드의 결과는 다음과 같습니다.

Toy number in play 5
Toy number in play after increment 6
Toy number in main 5
로그인 후 복사

C와 달리 play() 내에서 toyNumber를 변경해도 main()의 값에는 영향을 주지 않습니다. 이는 Java가 참조가 아닌 복사로 기본 값을 전달하기 때문입니다.

대체 접근 방식

1. 객체 래퍼 사용:

한 가지 접근 방식은 기본 요소를 객체에 래핑하고 객체를 참조로 전달하는 것입니다.

class ToyNumber {
    int toyNumber;
}
로그인 후 복사
public static void main(String[] args) {
    ToyNumber toyNumber = new ToyNumber(5);
    XYZ temp = new XYZ();
    temp.play(toyNumber);
    System.out.println("Toy number in main " + toyNumber.toyNumber);
}
로그인 후 복사
void play(ToyNumber toyNumber) {
    System.out.println("Toy number in play " + toyNumber.toyNumber);
    toyNumber.toyNumber++;
    System.out.println("Toy number in play after increment " + toyNumber.toyNumber);
}
로그인 후 복사

이 방법을 사용하면 다음이 가능합니다. play()에서 변경된 내용이 main()에 반영됩니다. 하지만 객체를 생성함으로써 추가적인 오버헤드가 발생합니다.

2. 값 반환:

또 다른 옵션은 수정된 값을 반환하는 것입니다.

int play(int toyNumber) {
    ...
    return toyNumber;
}
로그인 후 복사
public static void main(String[] args) {
    int toyNumber = 5;
    toyNumber = temp.play(toyNumber);
    System.out.println("Toy number in main " + toyNumber);
}
로그인 후 복사

이 접근 방식은 효과적이지만 반환 값을 받으려면 호출 사이트를 변경해야 합니다.

3. 정적 또는 클래스 변수:

play() 및 main()이 동일한 클래스 또는 클래스 인스턴스 내에 있는 경우 정적 또는 클래스 변수 사용을 고려하세요.

class XYZ {
    static int toyNumber = 5;
    ...
}
로그인 후 복사
public static void main(String[] args) {
    XYZ.play();
    System.out.println("Toy number in main " + XYZ.toyNumber);
}
로그인 후 복사
static void play() {
    ...
    XYZ.toyNumber++;
    ...
}
로그인 후 복사

이 방법을 사용하면 두 함수 모두 동일한 변수를 수정할 수 있지만 동시성 문제가 발생할 수 있으므로 멀티 스레드에는 권장되지 않습니다. 응용 프로그램입니다.

위 내용은 Java에서 프리미티브에 대한 참조별 전달 효과를 어떻게 달성합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿