關於java中“=”的思考(java引用)

關於java中“=”的思考(java引用)


事由

package com.mryao.node;

public class Node<E> {
    E item;
    Node<E> next;

    Node(E element){
        this.item = element;
        this.next = null;
    }

    public static void printListRev(Node<String> head){
        if(head != null){
            printListRev(head.next);
            System.out.println(head.item);
        }
    }

    public static Node<String> revList(Node<String> head){
        if(head == null){
            return null;
        }
        Node<String> nodeResult = null;
        Node<String> nodePre = null;
        Node<String> current = head;
        while (current != null){
            Node<String> nodeNext = current.next;
            if(nodeNext == null){
                nodeResult = current;
//                nodeResult.next = nodePre;爲什麼這一句可以註釋掉 不影響反轉鏈表  按照我的理解 這裏需要這句話
            }
            current.next = nodePre; // debug跟 發現在這裏current.next 變化 會引發nodeResult.next變化
            nodePre = current;
            current = nodeNext;//那爲什麼這裏 current 變了  上面的nodeResult沒有變化?
        }
        return nodeResult;
    }

    public static void main(String[] args){
        Node<String> head = null;
        Node<String> tail = null;
        head = new Node("1");
        tail = head;

        tail.next = new Node("2");
        tail = tail.next;
        tail.next = new Node("3");
        tail = tail.next;
        tail.next = new Node("4");
        tail = tail.next;

        Node<String> current = head;
        System.out.println("print node :");
        while (current != null){
            System.out.println(current.item);
            current = current.next;
        }
        System.out.println("print node rev :");
        Node.printListRev(head);
        Node.revList(head);
    }
}

按照博主的思路,在最後一步的判斷當中,應該是要有nodeResult.next = nodePre;這一句的,後來網上參考了一些其他的寫法 ,發現好像不需要,結果註釋掉嘗試了一下,居然可以正常運行


這怎麼行呢 ?趕緊debug跟着走了一遍,發現了原因所在。


在這個地方current 和 resultNode是指向同一個對象
所以在後面的current.next改變時,兩者都會變化
而在最後的current=nodeNext,只是改變了current的指向對象(null)
所以不會影響 resultNode


這讓我意識到java的對象的引用的問題於是嘗試用一些簡單的例子來加深對這方面的理解


例子一

    public static void main(String [] args){
        String a = "1";
        String b = a;
        String c = b;
        String d = b;
        a = "a";
        b = "b";
        System.out.println("a " + a);
        System.out.println("b " + b);
        System.out.println("c " + c);
        System.out.println("d " + d);
    }

輸出

a a
b b
c 1
d 1

例子二

package com.mryao;

public class A {
    private String a;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    public static void main(String[] args){
        A a = new A();
        a.setA("a");
        A b = a;
        A c = b;
        a.setA("c");
        System.out.println(a.getA());
        System.out.println(b.getA());
        System.out.println(c.getA());
    }
}

輸出

c
c
c

總結:Java中的引用可能和我們平時所認爲不太一樣,=這個符號不僅僅是賦值
在針對基礎類型的時候 ,=就是賦值
在針對非基礎類型對象的時候,它就變成了類似於c中的指針的概念了
如有錯誤,請指出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章