- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
特别是,我想知道 arg 是否始终链接,或者只是链接,因为函数 decloration 是 static
?
在我编写数千行代码并期望它是一种方式之前知道它们是否有任何怪癖是很高兴的,但在一种边缘情况下它不是。
郑重声明,我了解 string = new String[2];
里面changeValue()
将创建一个新字符串,并且更改不会传播到 main
string
的实例;
这里有一些示例代码来说明我所指的内容。
public class TestLink {
public static void changeValue(Object object) {
object.foo = "changed";
}
public static void changeValue(String[] string) {
string[0] = "changed";
}
public static void main(String[] args) {
String[] string = new String[2];
string[0] = "not changed";
changeValue(string);
if (string[0].equals("not changed")) {
System.out.println("not linked");
} else {
System.out.println("linked");
}
System.out.println(string[0]);
/*
output:
linked
changed
*/
}
}
最佳答案
从问题中的代码来看,听起来您真正要问的是:“是否存在一种边缘情况,我将数组引用传递到方法中并修改其内容,但这种修改并没有真的发生了吗?”
不,没有。让我们提取一些代码并更改一些名称,这样它们就不会产生误导:
public static void changeValue(String[] arg) {
arg[0] = "changed";
}
public static void main(String[] args) {
String[] foo = new String[2];
foo[0] = "not changed";
changeValue(foo);
if (foo[0].equals("not changed")) {
System.out.println("not linked");
} else {
System.out.println("linked");
}
System.out.println(foo[0]);
}
changeValue
接受数组引用(指向数组的值),并更改该数组的内容。如果代码编译(例如,所有类型等都是正确的)并且在运行时不会抛出异常(您没有将 null
或零长度数组传递给 changeValue
),那么不,没有任何边缘情况是行不通的。
如果我们深入研究该代码中发生的情况,我们就会明白为什么答案是“否”。我发现图片可以提供帮助,所以让我们在此添加一些 ASCII 艺术。
这一行:
String[] foo = new String[2];
在内存中给我们这个:
+----------+foo(ref 5426)---->| String[] | +----------+ | 0: null | | 1: null | +----------+
We have a variable, foo
, that contains a value. The value is called an object reference because it refers to an object (in this case, an array, so we sometimes call it an array reference). That's just a value that tells the JVM where the object is. I'm showing it as ref 5426
just to show that it's a value like any other value, not something magical; I've picked 5426 completely at random, we never see the actual value, the JVM hides it from us.
Then you do this:
foo[0] = "not changed";
给我们:
+-------------+foo(ref 5426)---->| String[] | +-------------+ +---------------+ | 0: ref 1897 |---->| String | | 1: null | +---------------+ +-------------+ | "not changed" | +---------------+
E.g., the first entry in the array contains value which is a reference to a string object.
Then we do this:
changeValue(foo);
它从 foo
获取值并将该值传递给 changeValue
。 changeValue
接收参数 arg
中的值。所以现在我们有这个:
+-------------+foo(ref 5426)--+->| String[] | | +-------------+ +---------------+ | | 0: ref 1897 |---->| String | | | 1: null | +---------------+ | +-------------+ | "not changed" | | +---------------+arg(ref 5426)--+
Since main
hasn't returned, foo
still exists, and it has the value ref 5426
. That value was copied into arg
, so arg
also has the value ref 5426
. That value tells the JVM where the array is.
Then you do:
arg[0] = "changed";
这给了我们:
+-------------+ +---------------+foo(ref 5426)--+->| String[] | | String | | +-------------+ +-----------+ +---------------+ | | 0: ref 2785 |---->| String | | "not changed" | | | 1: null | +-----------+ +---------------+ | +-------------+ | "changed" | | +-----------+arg(ref 5426)--+
数组中的第一个条目不再指向旧字符串,您已将该值替换为指向新字符串的新值。 (旧字符串会一直存在,直到垃圾收集器将其删除,但我们不再关心,我们没有任何对它的引用。)
changeValue
已完成,因此它返回,并且 arg
(参数)消失。
由于 foo
仍然具有相同的值 (ref 5426
),因此当您查找其中的第一个条目时,您会看到 放入其中的值>更改值
。
如果存在上述方法不起作用的极端情况,则必须发生以下情况之一:
将 foo
的值传递给 changeValue
并将其作为 arg
接收,由于某种原因不起作用。
将 foo
的值传递给 changeValue
并将其作为 arg
接收,制作副本由于某种原因数组。
当我们使用它来获取数组并更改它时,我们得到的 ref 5426
存在一些差异。
不存在发生这些事情的任何边缘情况。 :-)
关于java - java中是否存在函数中的变量未链接的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33912013/
SELECT *, `o_cheque_request.member_id`, `o_cheque_request.wallet_id` FROM `o_cheque_request`, `o_mem
根据某一条件从数据库表中查询 『有』与『没有』,只有两种状态,那为什么在写SQL的时候,还要**SELECT count(*)**呢? 无论是刚入道的程序员新星,还是精湛沙场多年的程序员老白,都是一如
我试图找出一个文件是否存在,如果存在,验证css样式是否已经存在,如果不存在,将它们写在文件末尾... 我已经完成了这一切,但分 3 个步骤: 该文件是否存在? FileInfo fi= new Fi
我们正在开发即时消息传递应用程序,并且需要在用户的化身上用绿点显示用户 friend 的“状态”。 “状态”远远超出了“my_app_is_opened_and_on_focus”,这意味着(我猜可能
模式 Movie(title, year, director, budget, earnings) Actor(stagename, realname, birthyear) ActedIn(stag
我有一个正在尝试创建的 MySQL 触发器,但无法获得正确的语法。 触发器应该遍历一组关键字并将其与插入数据库的新帖子的标题进行匹配。如果找到匹配项,它应该将新帖子分配给该存储桶并更新存储桶的关键字集
我有 3 个表......用户、更新和碰撞。 我想向发出 api 请求的用户返回最新订单的 feed 更新,并提供显示 feed 中每个状态所需的所有数据。我还需要包括更新是否已被发出 api 请求的
我正在尝试呈现一个带有 UIView 的 UIViewController。 以下是我在 viewDidLoad 方法中尝试的代码。 //create the view controller UIVi
我正在努力弄清楚如何在不对 mysql 进行两次调用的情况下从一个表中检查两件事。 我有一个 Members 表。我想测试MemberID 列中是否存在某个值,以及PhoneNumber 列中是否存在
以下代码给出了一个没有 Do Compile 错误的循环: Loop Sheets("Snap").Rows(1).AutoFilter Field:=5, Criteria1:=List
是否可以通过检查“dig”的输出来检查域名的存在? 在绑定(bind)源中,我发现了这些常量: 0 DNS_R_NOEROR 1 DNS_R_FORMERR 2 DNS_R_SERVFAIL 3 DN
Controller 有问题 我在 Windows 上使用服务器,一切正常,但在互联网上我试图访问页面 social_apartament/beauty_life/并且找不到该页面,代码错误 404这
/** This is struct S. */ struct S(T) { static if(isFloatingPoint!T) { /// This version works
JVM 类型删除如何帮助 Clojure?没有它,Clojure 还能存在吗?如果 JVM 有具体化的类型会发生什么?也就是说,Clojure 将如何改变? 最佳答案 Clojure 根本不会有太大变
许多论文等提到对“system()”的调用是不安全且不可移植的。我不反对他们的论点。 不过,我注意到许多 Unix 实用程序都有一个等效的 C 库。如果没有,源可用于各种这些工具。 虽然许多论文和此类
在我的 Node js 应用程序中,我有一个用户登录 api。上面我在服务器端代码中创建了一个名为 customerid 的变量。现在,当用户身份验证成功时。我将他的 userid 值存储在我的 cu
我有一个工作资源管理器组,由 Ubuntu 14.04 虚拟机、网络接口(interface)、公共(public) IP 地址和存储帐户组成。我已经从这组资源中创建了一个模板。 当我尝试部署这组资源
我有一个函数createminor4(arr,锦标赛)它基本上将arr分成4组,每组8人,然后将它们一次交换到tourney 1组。从那里它插入四个{},其中有 4 个带有空数组的键。 我已经在 Ch
我有一个图表,其中有两个图例。我需要更改其中一个图例的点的大小。 我需要更改图例中“市场类型”的项目符号大小。我使用示例 here但不适用于我的图表。 我的代码如下: k <- ggplot(subs
我有 fiddle here展示我正在尝试做的事情。 我有一个动态生成的表,因此列可以按用户选择的任何顺序显示。因此,我尝试获取两个特定 header 的索引,以便可以将 CSS 类添加到这两列以供稍
我是一名优秀的程序员,十分优秀!