> Java > java지도 시간 > 본문

JAVA에서 문자열과 배열의 매개변수 전달에 대해 이야기해 보겠습니다.

WBOY
풀어 주다: 2022-03-28 14:19:20
앞으로
2455명이 탐색했습니다.

이 기사는 Java 문자열 및 배열의 ​​매개변수 전달과 관련된 문제를 주로 소개하는 java에 대한 관련 지식을 제공합니다. Java가 값으로만 ​​전달하는 이유를 살펴보겠습니다.

JAVA에서 문자열과 배열의 매개변수 전달에 대해 이야기해 보겠습니다.

추천 학습: "java 학습 튜토리얼"

먼저 분명히 해야 할 것은 Java에는 값 전달만 있다는 것입니다! 값만 전달됩니다! 이론적 근거는 "think in java"에서 비롯됩니다. 다음 단계는 Java가 값으로만 ​​전달하는 이유를 자세히 설명하는 것입니다.
자바에는 기본형과 참조형, 그리고 특수형인 문자열이라는 두 가지 데이터 유형이 있기 때문에 크게 세 가지 측면으로 설명할 수 있습니다.

1. 기본 데이터 유형

코드를 먼저 살펴보세요

public class Demo01 {
    
    public void change(int a) {
        System.out.println("副本a 的初始值" + a);
        a = 20;
        System.out.println("副本a 的新值值" + a);
    }

    public static void main(String[] args) {
        int a = 10;
        Demo01 d = new Demo01();
        d.change(a);
        System.out.println("change方法执行后的值" + a);
    }
}
로그인 후 복사

분석:

                                              기본 데이터 유형은 값 전송을 따르므로 객체 d가 변경() 메서드를 호출하면 원본 데이터의 복사본을 방법 in의 매개변수에 대해 처음에는 원래 값과 copy a의 값이 모두 10입니다. a=20을 실행한 후에는 copy a의 값이 20이 됩니다.

따라서 실행 결과는 다음과 같습니다.

원칙은 아래 그림을 참조하세요

2. 참조 데이터 유형

코드를 먼저 살펴보세요

public class Demo02 {

    char[] ch = {'a', 'b', 'c'};

    public void change(char ch[]) {
        System.out.println("方法中ch[0]的初始值:" + ch[0]);
        ch[0] = 'g';
        System.out.println("方法中ch[0]执行后的新值:" + ch[0]);
    }

    public static void main(String[] args) {
        Demo02 d = new Demo02();
        System.out.println("对象d中数组的初始值是:"+d.ch);
        d.change(d.ch);
        System.out.println("对象d中数组的最终值是:"+d.ch);
    }
}
로그인 후 복사

분석:

매개변수인 경우 값이기도 합니다. 전달되는 것은 주소 값의 복사본이지만 두 주소는 동일한 위치를 가리킵니다. 복사 주소가 변경되지 않은 경우 복사 주소가 가리키는 데이터에 대한 작업은 원본 데이터의 값에 영향을 미칩니다. 메서드의 ch[] 배열과 원래 ch[] 배열은 동일한 데이터를 가리키므로 초기 단계에서는 ch[0]이 'a'를 가리키고 복사본의 ch[0]에 새 값이 할당됩니다. 'g'가 되는 것.
따라서 실행 결과는 다음과 같습니다.

원리는 아래 그림을 참조하세요.

3. 문자열의 매개변수 전달

코드를 먼저 보세요

public class Demo03 {
    public void change(String str2) {
        System.out.println("方法中str2初始值" + str2);
        System.out.println("方法中str2初始hashcode值" + str2.hashCode());
        str2 = "bbb";
        System.out.println("方法中str2赋值后:" + str2);
        System.out.println("方法中str2赋值后hashcode值:" + str2.hashCode());
    }

    public static void main(String[] args) {
        String str1 = new String("aaa");
        System.out.println("原始字符串str1的hashcode值:" + str1.hashCode());
        Demo03 d = new Demo03();
        d.change(str1);
        System.out.println("方法调用后str1的值" + str1);
    }
}
로그인 후 복사

분석:

문자열은 특별합니다. 데이터 유형은 하단 레이어가 최종 char[] 배열이므로 변경할 수 없으므로 문자열을 매개변수로 전달하면 동일한 방식으로 원본 객체를 복사하여 특수 배열로 작동할 수 있습니다. 이렇게 하면 복사 개체의 참조와 원본 개체의 참조가 모두 원본 문자열의 위치를 ​​가리키는 경우, 즉 str2가 처음 초기화될 때 가리키는 주소는 원본 객체 str1이 가리키는 위치, 즉 str2의 초기 해시코드 값은 원본 객체 str1의 해시코드 값과 동일합니다. 문자열에서 str2는 새 개체 참조를 가리킵니다. 즉, str2는 "bbb" 위치를 가리킵니다. str2의 해시코드 값은 변경되지만 str1의 원래 개체 참조는 변경되지 않았으며 "aaa"도 변경되지 않았으므로 str1은 여전히 ​​"aaa"를 가리킵니다. 실행 결과는 다음과 같습니다.

다음으로 좀 더 구체적인 문자열 예를 살펴보겠습니다.

public class Demo04 {

    public static void main(String[] args) {
        StringBuffer s = new StringBuffer("hello");
        StringBuffer s2 = new StringBuffer("hi");
        test(s, s2);
        System.out.println("方法調用后s的值:" + s);
        System.out.println("方法調用后s2的值:" + s2);
    }

    static void test(StringBuffer s3, StringBuffer s4) {
        System.out.println("方法初始化時s3的值" + s3);
        System.out.println("方法初始化時s4的值" + s4);
        s4 = s3;
        s3 = new StringBuffer("new");
        System.out.println("第一步变化后s3的值" + s3);
        System.out.println("第一步变化后s4的值" + s4);
        s3.append("boy");
        s4.append("gril");
        System.out.println("第二步变化后s3的值" + s3);
        System.out.println("第二步变化后s4的值" + s4);

    }
}
로그인 후 복사
이번에는 결과를 먼저 살펴봅니다.


그런 다음 분석합니다.

메서드가 실행되기 전에, 문자열 s1과 s2가 가리키는 위치는 각각 "hello"와 "hi"입니다.

(1) 그런 다음 메서드의 매개 변수 s3 및 s4가 에서와 동일하게 초기화됩니다. 위의 예에서는 s1s2와 동일한 위치를 가리키거나 s1s2가 s3s4에 대한 개체 참조 복사본을 제공합니다. 이때 s3s4의 값은 "hello" 및 "hi"

입니다.

(2) 그런 다음 s4=s3을 실행합니다. 이 작업은 s3의 개체를 s4로 참조합니다. s4가 "hello"인 경우 이 작업은 s3에 a를 제공하는 것과 동일합니다. new 객체 참조이고 s3는 문자열이 "new"인 위치를 가리키므로 이때 s3 = "new", s4 = "hello"

(3) 그런 다음 s3.append("boy"); Append("gril"); StringBuffer의 추가 메소드는 s3s4가 새 객체 참조를 가리키므로 작동하지 않으며 이는 원래 기반으로 작동하므로 작업 후 s3 = "newboy", s4 = "hellogril "

(4) 이 시점에서 메서드 호출이 완료되었습니다. 돌아가서 프로세스에서 s3s4가 s1s2에 미치는 영향을 검토해 보겠습니다.
——- A. 먼저 s3는 s1처럼 "hello"를 가리키기 시작한 다음 s3에 대한 새 객체 참조 "new"를 생성합니다. 이때 s3와 s1은 더 이상 반센트 관계를 갖지 않으며 s3는 추가(boy) 수행 마지막으로 s3 = "newboy";
——– B. s4와 s2는 모두 처음에 "hi"를 가리키고 s3는 초기 값(즉, s1의 복사본)을 s4에 제공합니다. 이때 s4는 "hello"를 가리키며(이것은 s4와 s1 사이의 관계를 생성합니다), s4와 s1이 동일한 위치를 가리키기 때문에 추가(그릴) 작업을 수행합니다. s4=s1="hellogrill"로 변경하세요.
——- C. 그러면 s2가 가리키는 객체 "hi"는 변경되지 않았으며 s1이 가리키는 "hello"는 추가("grill") 작업에서 "hellogril"이 되었다는 것이 분명해집니다.

4. 요약

  • 기본 데이터 유형을 메소드의 형식 매개변수로 사용하는 경우 메소드 본문의 형식 매개변수를 수정해도 실제 매개변수의 값에 영향을 미치지 않습니다.

  • 참조 데이터 유형을 사용할 때 메소드 형식 매개변수로서 메소드 본문의 형식 매개변수가 가리키는 데이터 내용을 수정하면 형식 매개변수 변수와 실제 매개변수 변수가 동일한 힙 영역을 공유하기 때문에 실제 매개변수 변수의 값에 영향을 미칩니다.

  • 참조 데이터 유형을 사용할 때 메소드의 형식 매개변수로 사용되는 경우 메소드 본문에서 형식 매개변수 변수의 방향이 변경되어도 실제 매개변수 변수의 값에는 영향을 미치지 않습니다. 매개변수 변수와 실제 매개변수 변수는 각각 다른 힙 영역을 가리킵니다. 마지막 예가 가장 생생한 설명입니다.

  • 문자열 매개변수에 관해서도 매개변수 변수 지정이 변경되었는지 여부에 따라 달라집니다. 왜냐하면 String의 맨 아래 레이어는 최종 유형 char[]이기 때문입니다. String s = "aaa" 또는 String s = new String ( "aaa"), s에 대한 새 개체 참조가 생성됩니다. 그러나append() 메서드가 호출되면 새 개체를 가리키지 않고 원래 가리킨 개체가 변경되고 공유되는 개체 참조도 변경됩니다.

  • 마지막으로 반복되는 점은 Java에는 참조 전송이 없고 값 전송만 있다는 것입니다. 참조 유형은 특수한 값 전송입니다(해당 주소의 복사본이 매개변수에 제공되지만 기본 데이터와는 다릅니다). 주소가 가리키는 객체가 변경되면 공유 사유로 인해 원래 객체도 변경됩니다.

추천 학습: "java tutorial"

위 내용은 JAVA에서 문자열과 배열의 매개변수 전달에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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