java内存模型中对象内部对象引用的存储

czfnxgou  于 2021-07-13  发布在  Java
关注(0)|答案(3)|浏览(317)

在研究链表实现时,我需要弄清楚在这种情况下,引用和对象是如何存储在堆栈和堆中的,在这种情况下,对象本身有引用,

public class MyLinkedList {

    private Node head;
    private int listCount;

    public MyLinkedList() {
        head = new Node("0");
        listCount = 0;
    }

    public void add(Object data) {
        Node nodeTemp = new Node(data);
        Node nodeCurr = head;

        while (nodeCurr.getNext() != null) {
            nodeCurr = nodeCurr.getNext();
        }

        nodeCurr.setNext(nodeTemp);
        listCount++;

    }
}

public class LinkedListMain {
    public static void main(String[] args) {
        MyLinkedList ls = new MyLinkedList();
        ls.add("1");
}

现在mylinkedlist对象被堆栈中的“ls”引用引用,而mylinkedlist本身也在堆中。我明白了。
但是当我们从mylinkedlist构造器创建新节点时,它通过“head”引用引用,“head”引用存储在哪里?我的疑问是,既然“node head”在(属于)mylinkedlist对象中,那么“head”是与“ls”一起存储在堆栈中,还是在mylinkedlist对象中?

wnrlj8wa

wnrlj8wa1#

您需要了解java的两个重要方面:
所有java对象都在java堆中分配。所有的。
在java中,变量永远不是对象。从未。但是变量可以是对对象的引用(或者变量可以是 int ,但这些也不是对象。)
这意味着你的 main 方法分配 MyLinkedList 对象,并将对该对象的引用存储在名为 ls . 那个 MyLinkedList 对象(本身没有名称)可以存储对 Node 对象(也将存储在java堆上)的本地字段中 head .
没有任何其他对象被存储在任何对象的“内部”。其中只存储对其他对象的引用。
警告:虽然这个答案是正确的,但我认为java语言是如何工作的,只要你不能分辨出区别,运行时就可以进行各种优化。例如,“java堆”不是算法意义上的堆,甚至常常不是与“c++堆”相同的意义上的堆。javajit允许从一个类似栈的结构(younggen)甚至从当前栈(由于escape分析)分配java对象。也就是说,这些实现细节在您刚刚学习该语言时并不相关。

8fsztsew

8fsztsew2#

main()中分配的“mylinkedlist”对象由“ls”引用ls“在堆栈上-main的局部变量。“mylistedlist”的这个示例的成员在堆上。在add()中,nodetemp和nodecurr是堆栈变量,它们是对节点的引用。节点本身在堆上。”head”是一个类成员变量,与listcount一起位于堆中。
在java中,(非静态)类成员必须始终在堆上。

hs1ihplo

hs1ihplo3#

所有示例变量和对象都存储在堆中。而局部变量在堆栈上。 head 将在堆上& ls 将在堆栈上。

public class MyLinkedList {

    private Node head;
    private int listCount;
``` `head` &  `listCount` 两个都会堆起来。

相关问题