Java、传值、引用变量

2023-12-14

我在理解以下示例中 Java 的“按值传递”操作时遇到问题:

public class Numbers {

    static int[] s_ccc = {7};
    static int[] t_ccc = {7};

    public static void calculate(int[] b, int[] c) {

        System.out.println("s_ccc[0] = " + s_ccc[0]); // 7
        System.out.println("t_ccc[0] = " + t_ccc[0]); // 7

        b[0] = b[0] + 9;  
        System.out.println("\nb[0] = " + b[0]); // 16

        c = b;
        System.out.println("c[0] = " + c[0] + "\n"); // 16
    }

    public static void main(String[] args) {

        calculate(s_ccc, t_ccc);

        System.out.println("s_ccc[0] = " + s_ccc[0]);  // 16
        System.out.println("t_ccc[0] = " + t_ccc[0]);  // 7 
    }
}

我知道,因为 s_ccc 是一个引用变量,所以当我将其赋予方法calculate() 并对其在方法中的元素进行一些更改时,即使在我离开该方法后,这些更改仍然存在。我认为 t_ccc 也应该如此。又是 一个引用变量,我将其交给方法calculate(),并在该方法中将t_ccc的引用更改为s_ccc的引用。现在t_ccc应该是一个指向数组的引用变量,该数组有一个int类型的元素等于16。但是当方法calculate()离开时,t_ccc似乎指向它的旧对象。为什么会发生这种情况?改变不应该也保留吗?毕竟它是一个参考变量。

Regards


在前面的问题中对 Java 如何传​​递变量进行了深入讨论“Java是按引用传递吗?》。Java确实传递对象引用by value.

在您的代码中,数组(对象)的引用被传递到calculate()。这些引用是按值传递的,这意味着对值的任何更改b and c仅在方法内可见(它们实际上只是s_ccc and t_ccc)。这就是为什么t_ccc in main()从未受到影响。

为了强化这个概念,一些程序员将方法参数声明为final变量:

public static void calculate(final int[] b, final int[] c) 

现在,编译器甚至不允许您更改b or c。当然,这样做的缺点是您无法再在您的方法中方便地操作它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java、传值、引用变量 的相关文章

随机推荐

  • 创建数组变量

    我想创建这种输出 var s1 Sony 7 Samsung 5 LG 8 这样我就可以用它来将我的图表作为变量传递 从我的ajax结果中得出 success function data code to extract the data v
  • C# 为所有可选参数提供值

    我正在读一本 C 书籍 正在阅读命名参数和可选参数一章 我读过一个项目符号 上面写着 如果存在多个可选参数并且指定了一个值 一 所有前面的可选参数也必须提供值 您能给我一个例子吗 因为我无法从代码中重现上述语句 以此方法签名为例 publi
  • 从使用 JWS 下载的 jar 文件中提取一些内容

    我试图从使用 java webstart 下载的 jar 文件中提取一些文件 下面的代码用于定位 jar 并启动文件系统 1 final ProtectionDomain domain this getClass getProtection
  • 如何在 UIView 中加载 xib 文件

    我一直在到处寻找 但到目前为止没有任何对我有用的东西 基本上我想要一个名为 rootView xib 的 xib 文件 在其中我想要一个 UIView 让我们称之为 containerView 它只占据屏幕的一半 所以会有常规视图和新视图
  • iframe 和父站点之间如何通信?

    iframe 中的网站不在同一个域中 但两者都是我的 我想在iframe和父站点 是否可以 对于不同的域 无法直接调用方法或访问 iframe 的内容文档 你必须使用跨文档消息传递 父级 gt iframe 例如在顶部窗口中 myIfram
  • Laravel 集团按月记录和总价

    您好 我正在尝试按月份对记录进行分组并对订单中的价格进行求和 我尝试过这样的事情 order Order select DB raw sum price as sums gt groupBy function date return Car
  • 带有 Tomcat 9 的 jakarta.servlet - 未找到问题 [重复]

    这个问题在这里已经有答案了 我有一个使用 eclipse 和 tomcat 9 服务器运行的应用程序 当我运行应用程序时 它会在浏览器中打开 index html 页面 但在索引页面内调用的 API 会出现 404 状态错误 我尝试了各种
  • 通过鼠标点击删除节点,networkX,python 2.7

    我用Python 2 7用networkX编写了一个程序 它绘制了一棵带有黑白节点的树 这是一个最小的例子 import networkx as nx import matplotlib pyplot as plt import numpy
  • 如何立即调用 C++ lambda?

    我继承的类的构造函数需要传入一个重要的对象 与此类似 MyFoo MyFoo SomeBase complexstuff return The complexstuff没有什么关系MyFoo 所以我不想将其传递进去 而不是编写某种返回的一次
  • 更改 HTML 文本框:覆盖而不是插入为用户类型

    我正在开发一项允许编辑文本的服务 为了在此过程中帮助用户 我想允许用户将文本字段设置为覆盖模式 就像在 Word 等中一样 如何将 HTML 文本框的行为更改为覆盖而不是插入文本当用户输入时 例如 如果文本框包含以下文本 This is a
  • 有什么方法可以根据类模板类型初始化此变量吗?

    我有课stats带有模板 这样就可以灵活使用 不过 我对模板很陌生 我认为它们的重点是使其在用户周围灵活 所以我觉得我做错了什么 因为我撞到了一堵小墙 include
  • SQL,关于连接的问题

    我在 sql 2012 中有两个表 名称和产品 其结构 name id int increment name1 nvarchar 50 prod id int increment products nvarchar 50 id name i
  • 如何在 Indy 10 中启用完美前向保密?

    我在 Delphi 2010 中使用 OpenSSL 1 0 2o 和 Indy 10 6 2 这是我到目前为止所做的 procedure TServerForm FormCreate Sender TObject var LEcdh PE
  • 对 WCF 行为扩展进行单元测试

    这真让我抓狂 我有一个扩展 如果出现错误 我们可以用它来更改请求的内容响应 基本上 如果一切正常 它会正常序列化为 JSON 但如果我们收到未处理的异常 我们会根据不同的对象进行序列化 我们需要围绕此进行单元测试 但我不知道如何编写它们 验
  • UITableView 自定义单元格图像在滚动后消失。

    我正在创建我的开放网格视图 我创建了一个自定义单元格 如下所示 我像这样处理填充它 UITableViewCell tableView UITableView tableView cellForRowAtIndexPath NSIndexP
  • android LoginButton.setFragment 中的 facebook 登录

    我的 LogginButton 有问题 LoginButton authButton LoginButton v findViewById R id authButton authButton setFragment this 我使用的片段
  • 从 $request_body 记录 POST 数据

    我的配置设置可以处理一堆 GET 请求 这些请求呈现的像素可以很好地处理分析和解析查询字符串以进行日志记录 使用额外的第三方数据流 我需要处理对给定 URL 的 POST 请求 该 URL 在其请求正文中具有预期可记录格式的 JSON 我不
  • 如何在 JavaScript 中从多维数组中删除空数组?

    我在从 Google Sheets 中的搜索应用程序的多维数组中删除空数组 对象时遇到问题 我在用getLastRow所以我以为我会避免这个问题 但不幸的是事实并非如此 我的数组如下所示 1 39080000912E11 RSSMA0040
  • 通过 std::bind 传递右值

    我想传递一个右值std bind到 C 0x 中采用右值引用的函数 我不知道该怎么做 例如 include
  • Java、传值、引用变量

    我在理解以下示例中 Java 的 按值传递 操作时遇到问题 public class Numbers static int s ccc 7 static int t ccc 7 public static void calculate in