2016-10-03 2 views
0
class insertionSort 
{ 
    public void print(int arr[]) 
    { 
     arr[0]=999999999; 
    } 
} 

public class Sorting 
{ 
    private int[] arr= {0,56,8,75,45,21,68,9,54,2,65,87,52,65,8,5,20,0,2,2}; 

    public static void main(String[] arg) 
    { 
     Sorting sort = new Sorting(); 
     insertionSort inSort = new insertionSort(); 
     inSort.print(sort.arr); 
     System.out.println(sort.arr[0]); 
    } 
} 

Sort.arr은 private 변수이지만 inSort 개체가 arr [0]을 조작 할 수있는 이유는 무엇입니까?java private 멤버 참조로 호출

매개 변수가 참조 또는 주소로 전달된다는 것을 알고 있습니다.

함수에서 값을 전달하는 방법은 무엇입니까?

+0

출력 : 999999999 – enamel

+0

Java는 항상 값으로 전달되지만 'arr'은 참조이며이 참조는 값으로 전달됩니다. 배열을 복사하지 마십시오. –

+0

하지만 원래 Sort 개체 arr [] 값이 변경됩니다. – enamel

답변

2

어떻게 함수 값을 전달할 수 있습니까?

자바 항상 패스 별 값, 절대 패스에 의해 참조 (this question and its answers 참조). 귀하의 예제에서 전달되는 값은 배열을 가리키는 객체 참조 입니다.

귀하의 문제는 가치에 의한 전달과 관련이 없으며, 참조 인 객체 참조 (값)가 메소드에 전달된다는 사실과 관련이 있습니다. 그러면 참조가 참조하는 객체에 대한 메서드 액세스가 제공됩니다. 그래서 자연스럽게 그 객체의 상태를 수정할 수 있습니다. 귀하의 경우 배열의 인덱스 0에 저장된 내용을 수정할 수 있습니다.

별도로 객체 참조를 가져 오는 인스턴스 변수 (필드)는 private입니다. inSort.print(sort.arr); 코드는 Sorting 클래스에 있으므로 sort.arr에 액세스 할 수 있고 해당 값 (객체 참조)을 읽고 해당 값 (객체 참조)을 메소드에 전달할 수 있습니다.


1 그것은 단어 "개체 참조"의 "참조"와 "통과별로 참조"에 대한 매우 다른 두 가지을 이야기하고 실현하는 것이 중요합니다. "객체 참조"에서 객체 (객체에 대한 포인터)에 대한 참조를 말합니다. "pass-by-reference"에서는 변수에 대한 참조 (포인터)에 대해 설명합니다. 자바는 참조에 의한 패스를 가지고 있지 않다.

관련 문제