当前位置: 首页 > 知识库问答 >
问题:

LinkedList的insert方法中局部变量“node”的作用域

王昊
2023-03-14

在下面的代码中

Node node = new Node(data);
node.next = head;
head = node;

“局部”变量“节点”的范围在方法插入内部定义的块内,对吗?所以我的印象是,当我们不在方法插入,我们失去了访问变量节点,这给我(错误的)印象,头不再指向有效的内存位置。

为什么这里的情况不是这样?

换句话说,所以头是指在执行本地代码节点=新节点(数据)期间分配的内存地址,对吗?这种分配不是应用在堆栈内存上吗?每次函数调用完成时,分配给该调用的堆栈内存都会被释放,这不是吗?

以下是完整的代码

public class LinkedList {
    public Node head;

    public void insert (int data){
        if (head == null){
            head = new Node(data);
        } else {
            Node node = new Node(data);
            node.next = head;
            head = node;
        }
    }
}


class Node {
    public int data;
    Node next; 
    Node (int data){
        this.data = data;
    }
}

共有1个答案

宋飞文
2023-03-14

这里有几个我们关心的概念:变量、对象和引用值。

变量是值的容器。对象是在内存中可寻址的数据结构(具有某些行为)。引用值是引用类型的值。它是一个指向对象的指针。

这里的JVM对此进行了解释

有三种引用类型:类类型、数组类型和接口类型。它们的值分别是对动态创建的类实例、数组或实现接口的类实例或数组的引用。

在JLS这里

引用值(通常只是引用)是指向这些对象的指针,以及一个特殊的空引用,它不引用任何对象。

你这里有什么

Node node = new Node(data);

是一个名为node的变量,类型为node,初始化后存储一个值,该值引用类型为node的对象。

当你这样做的时候

head = node;

您复制存储在节点中的引用值,并将其存储在名为head的变量中。

一旦执行离开了ther块,变量节点就不再处于作用域中,因此无法使用。但是变量head仍然存储分配给它的值。

注意,范围是

程序的区域,其中声明声明的实体可以使用一个简单的名称来引用,只要它是可见的(§6.4.1)。

它与值的有效时间或对象在内存中的保留时间无关。

 类似资料:
  • 问题内容: 嗨,我正在浏览有关内部类的SCJP书,发现了这一说法,类似这样。 方法本地类只能引用已标记的本地变量 在解释中,指定的原因与本地类对象和堆上的局部变量的范围和生存期有关,但我无法理解。我在这里想念任何东西吗? 问题答案: 原因是,在创建方法本地类实例时,编译器实际上会将其引用的所有方法本地变量复制到其中。这就是为什么只能访问变量的原因。甲变量或参考是不变的,所以它停留在同步与其方法本地

  • 主要内容:Python局部变量,Python全局变量,获取指定作用域范围中的变量所谓 作用域(Scope),就是变量的有效范围,就是变量可以在哪个范围以内使用。有些变量可以在整段代码的任意位置使用,有些变量只能在函数内部使用,有些变量只能在 for 循环内部使用。 变量的作用域由变量的定义位置决定,在不同位置定义的变量,它的作用域是不一样的。本节我们只讲解两种变量, 局部变量和 全局变量。 Python局部变量 在函数内部定义的变量,它的作用域也仅限于函数内部,出了函数就不能

  • 4. 全局变量、局部变量和作用域 我们把函数中定义的变量称为局部变量(Local Variable),由于形参相当于函数中定义的变量,所以形参也是一种局部变量。在这里“局部”有两层含义: 1、一个函数中定义的变量不能被另一个函数使用。例如print_time中的hour和minute在main函数中没有定义,不能使用,同样main函数中的局部变量也不能被print_time函数使用。如果这样定义:

  • 我有一个类需要测试。以下是的定义: 并根据值从数据库中检索一些要操作的数据。对于该数据库,值通过JSON文件持久化。 这使事情复杂化了。我需要的是在测试时将其设置为某个特定的日期。有没有办法可以用mockito模拟局部变量的值?

  • 本文向大家介绍Java中的局部变量,包括了Java中的局部变量的使用技巧和注意事项,需要的朋友参考一下 局部变量在方法,构造函数或块中声明。 输入方法,构造函数或块时将创建局部变量,并且一旦退出方法,构造函数或块,该变量将被销毁。 访问修饰符不能用于局部变量。 局部变量仅在声明的方法,构造函数或块内可见。 局部变量在内部在堆栈级别实现。 局部变量没有默认值,因此应声明局部变量,并应在首次使用前分配

  • 本文向大家介绍从局部变量和全局变量开始全面解析Python中变量的作用域,包括了从局部变量和全局变量开始全面解析Python中变量的作用域的使用技巧和注意事项,需要的朋友参考一下 理解全局变量和局部变量 1.定义的函数内部的变量名如果是第一次出现, 且在=符号前,那么就可以认为是被定义为局部变量。在这种情况下,不论全局变量中是否用到该变量名,函数中使用的都是局部变量。例如: 输出结果是123。说明