>Java >java지도 시간 >매개변수 전달이란 무엇입니까? 그의 용도는 무엇입니까?

매개변수 전달이란 무엇입니까? 그의 용도는 무엇입니까?

零下一度
零下一度원래의
2017-07-21 22:03:374564검색

1 개요

1. 매개변수 전달이란 무엇인가요?

메서드 호출 시 형식 매개변수에 데이터를 전달하는 과정을 매개변수 전달이라고 합니다. 프로그래밍 언어에는 값에 의한 전송과 참조에 의한 전송이라는 두 가지 전송 모드가 있습니다. 여기서 언급하는 두 가지 전송 방식은 자바에서 사용되는 전송 방식에만 국한되지 않고, 자바를 포함한 많은 프로그래밍 언어에서 나타나는 전송 방식이라는 점을 강조해야 한다.

2. 변수형

자바에서는 기본형 데이터를 가리키는 변수를 원시변수라 하고, 객체를 가리키는 변수를 참조변수라고 합니다.

2 가치 전달

1. 가치 전달이란 무엇인가요?

변수의 복사본을 메서드에 전달합니다. 메서드 내부와 외부의 작업은 격리됩니다. 메서드 내의 변수에 대한 작업은 메서드 외부의 변수에 반영되지 않습니다.

2. 원래 변수

    public void change(int b) {
        b = 7;
    }

    @Testpublic void testBasic() {int a = 9;
        change(a);
        System.out.println(a);
    }

실제 출력: 9

매개변수가 전달되면 값 전달 규칙에 따라 변수 b는 리터럴을 가리키는 a의 복사본을 받습니다. value "9":

다음으로 메서드 내에서 b에 값 7을 할당하여 b가 7을 가리키도록 합니다. a와 b는 두 개의 독립 변수이므로 참조가 없습니다. - 그들 사이의 참조 관계는 여전히 9를 가리킵니다:

3.String

    public void change(String str01) {
        str01 = "baidu";
    }

    @Testpublic void testString() {
        String str = new String("www.baidu.com");
        change(str);
        System.out.println(str);
    }

실제 출력: www.baidu.com

매개변수가 전달되면 str str01이 힙에 "www.baidu.com"을 저장하는 객체도 가리키도록 자신의 복사본을 str01에 전달합니다.

메서드 내에서 str01에 값을 할당하여 str01이 가리키도록 합니다. 메서드 영역의 문자열 상수 풀에 있는 "baidu"에 대해 str은 여전히 ​​힙에 있는 "www.baidu.com"을 가리킵니다. str과 str01은 서로 다른 개체를 가리키며 서로 영향을 주지 않습니다.

여기서 주목해야 할 점: Java는 String을 불변 객체로 설계합니다. 즉, String 객체에 포함된 리터럴 값이 변경되면 Java는 새 객체를 생성하고 변수가 새 객체를 가리킵니다.

4.StringBuilder

    public void change(StringBuilder builder01) {
        builder01.append(" World!");
    }

    @Testpublic void testStringBuilder() {
        StringBuilder builder = new StringBuilder("Hello");
        change(builder);
        System.out.println(builder);
    }

실제 출력: Hello World!

매개변수 전송이 완료된 후 builder01 변수는 빌더 변수의 복사본을 가져오고 복사본과 원래 변수는 포인트를 가져옵니다. 힙에 있는 동일한 객체에:

메소드 내에서 builder 변수는 새 객체를 가리키지 않고 여전히 builder와 동일한 객체를 가리키므로 builder가 힙의 동일한 객체에 액세스할 때 heap, 데이터 변경:

5. Custom type

public class MyInner {public int a;
}public class Test{public void change(MyInner in01) {
        in01.a = 1;
    }

    @Testpublic void testDemain() {
        MyInner in = new MyInner();
        in.a = 9;
        change(in);
        System.out.println(in.a);
    }

}

실제 출력: 1

실행 프로세스는 StringBuilder 실행 프로세스와 동일하므로 이겼습니다. 여기서 자세히 설명하지 마세요. 위 코드를 다음과 같이 일부 변경해 보겠습니다.

public class MyInner {public int a;
}public class Test{public void change(MyInner in01) {
        in01=new MyInner();//使in01指向一个新的对象in01.a = 1;
    }

    @Testpublic void testDemain() {
        MyInner in = new MyInner();
        in.a = 9;
        change(in);
        System.out.println(in.a);
    }

}

实际输出:9

参数传递完成时,in01与in指向同一个对象,in01对对象的操作等同于in对对象的操作,接着在方法内部执行"in01=new MyInner();",这样in01就指向了一个新的对象,in01所有的操作都与in无关了:

综合以上的运行结果与分析,可知java参数传递方式符合值传递。

 三 引用传递

1.什么是引用传递?

将变量自身的内存地址传入方法中,方法中的变量指向方法外的变量,在方法中对变量的操作就是对方法外变量的操作

2.自定义类型

public class MyInner {public int a;
}public class Test{public void change(MyInner in01) {
        in01=new MyInner();//使in01指向一个新的对象in01.a = 1;
    }

    @Testpublic void testDemain() {
        MyInner in = new MyInner();
        in.a = 9;
        change(in);
        System.out.println(in.a);
    }

}

实际输出:9

如果采用引用传递,传递完成以后,in01指向in,对in01的操作就是对in的操作,in01指向对象2,那么in也指向对象2,输出1,与实际不符,所以不是采用引用传递

不再一一分析其他变量类型,分析后可以发现,java在传递参数时采用的不是引用传递,而是值传递。

简单讲,值传递时方法内外是两个拥有同一指向的变量,引用传递时方法内外是同一个变量。

위 내용은 매개변수 전달이란 무엇입니까? 그의 용도는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.