2012-12-11 2 views
0

나는 java를 처음 사용했습니다. 질문이 명확하지 않을 수 있습니다. 코드 사용법을 설명하겠습니다. 아래 코드는 링크 된 목록의 값을 출력하는 함수입니다. 함수의 첫 번째 줄은 HeadNode 참조가 가리키는 동일한 개체를 가리키는 참조를 만듭니다. 따라서 currentNode를 변경하면 HeadNode가 가리키는 객체에 영향을줍니다. while 루프 내에서 currentNode를 변경하려고합니다. 그러나 함수를 종료 한 후에 linkedList가 변경되지 않았 음을 확인합니다. 왜?함수의 매개 변수 값을 변경하지 않는 함수에서 참조를 만드는 방법은 무엇입니까?

static void PrintLinkedList(ListNode HeadNode) 
    { 
     ListNode currentNode = HeadNode; 
     while(currentNode != null) 
     { 
      System.out.println(currentNode.getData()); 
      currentNode = currentNode.getNext(); 
     } 
    } 

UPDATE : 나는 LinkedList의 반전하는 함수를 구현하면 다음 코드가 실행 된 후이 후 질문을 위로 가져 날의 이유는, 내 tempNode가 null이 될 것을

:

static ListNode ReverseLinkedList(ListNode headNode) 
    { 
     ListNode headNodeTemp = headNode; 
     headNodeTemp.setNext(null); 
     ListNode tempNode = headNode.getNext(); //temp becomes null because headNode is changed. Why?? 
     ListNode currentNode = headNodeTemp; 
     while(tempNode != null) 
     {... 

답변

2

따라서 currentNode를 변경하면 HeadNode가 가리키는 개체에 영향을 미칩니다.

아니요, currentNodeHeadNode도 참조합니다. 당신은 그 물체를 결코 바꿀 수 없으며 당신이 바꾸는 것은 currentNode이 말하는 것입니다.

currentNode = currentNode.getNext(); 

currentNode은 다음 객체를 가리 키지 만 어떤 객체도 변경하지 않습니다.

currentNode.mutate(); 
currentNode.property = 17; 

이 (가) 지적-하는 개체를 변경할 것, 당신이 메소드를 호출하거나 속성을 설정해야하는 개체를 변경하려면, 그리고 객체가 HeadNode을 통해 조회 할 때 이러한 변화를 볼 수있을 것이다.

currentNode = currentNode.getNext(); 

currentNode은 다른 개체를 가리키고 있습니다. 여기

static ListNode ReverseLinkedList(ListNode headNode) 
{ 
    ListNode headNodeTemp = headNode; 
    headNodeTemp.setNext(null); 

에서

, 우리는 지적이-하는 객체를 변경하는 메소드를 호출합니다. 이름으로 가면 next 필드를 null으로 설정합니다. 그리고 객체 headNodeTemp이 가리키는 객체는 headNode입니다.

ListNode tempNode = headNode.getNext(); //temp becomes null because headNode is changed. Why?? 
    ListNode currentNode = headNodeTemp; 
    while(tempNode != null) 
    {... 

당신은 setNext(null) 라인 위의

ListNode tempNode = headNode.getNext(); 

라인을 이동해야합니다.

static ListNode ReverseLinkedList(ListNode headNode) 
{ 
    ListNode headNodeTemp = headNode; 
    ListNode tempNode = headNode.getNext(); 
    headNodeTemp.setNext(null); 
    ListNode currentNode = headNodeTemp; 
    while(tempNode != null) 
    {... 
+0

그러나 currentNode는 해당 객체를 참조합니다. 따라서 currentNode의 모든 변경 사항은 객체를 변경합니다. 권리? – user1701840

+0

아니요, 'currentNode'는 객체의 주소를 보유하는 변수 일뿐입니다. 'currentNode'에 대한 변경은'currentNode'가 가리키는 것을 바꿉니다. 'currentNode'가 가리키는 객체를 변경하려면 메소드를 호출하거나 속성을 설정해야합니다. 'currentNode.mutate();'는 객체를 변경시킵니다. –

+0

광산을 읽으십시오. 분명히 밝힙니다. 그렇지 않다면 핑을하십시오. 개체를 변경하지 않으려면 개체를 변경하는 메서드를 호출하면 안됩니다. 그러나 아마 그것은 질서의 문제라고 생각합니다. –

0

혼란스러운 물체와 참조입니다.

currentNode = xcurrentNode이 가리키는 개체는 변경되지 않습니다.오히려 currentNode변수이 다른 오브젝트를 가리 키도록 변경합니다.

이전 개체를 가리키는 다른 필드 나 변수에는 영향을주지 않습니다.

0

다른 게시물과 일치합니다. 모든 인수는 Java에서 값별로 전달됩니다. 데모 :

public static void main(String[] args) { 

    List a = new ArrayList(); 
    a.add("Fred"); 

    changeA(a); 
    // contents of a is "Fred" not "Barney" (change to 'a' not reflected back here) 
    // because all arguments are Pass-By-Value 

    addToA(a); 
    // contents of a is "Fred" AND "Barney" 

    int b = 10;  

    changeB(b); 
    // b = 10 (not 20) 
} 

static void changeA(List a) { 
    a = new ArrayList(); // a is now a different object 
    a.add("Barney"); 
} 

static void addToA(List a) { 
    a.add("Barney"); 
} 

static void changeB(int b) { 
    b = 20; 
} 
관련 문제