Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中实例变量是通过引用传递的吗?_Java_Variables_Reference_Pass By Reference - Fatal编程技术网

在Java中实例变量是通过引用传递的吗?

在Java中实例变量是通过引用传递的吗?,java,variables,reference,pass-by-reference,Java,Variables,Reference,Pass By Reference,现在我知道Java纯粹是通过值传递的,但是实例变量是通过引用传递的吗 我的意思是(我知道这段代码很糟糕,但它是伪代码: //Instance variables private Object[] array = new Object[10]; array[4] = new Object[5]; //Private method private Object ar(int x) { return array[x]; } //Inside Main or some other meth

现在我知道Java纯粹是通过值传递的,但是实例变量是通过引用传递的吗

我的意思是(我知道这段代码很糟糕,但它是伪代码:

//Instance variables
private Object[] array = new Object[10];
array[4] = new Object[5];

//Private method
private Object ar(int x)
{
     return array[x];
}

//Inside Main or some other method
ar(4)[0] = "Foo";
现在,是否会将
array[4]
中数组上的第一个插槽更改为“Foo”,因为
array
是一个实例变量

澄清:
我知道所有的都是通过值传递的。但是我们讨论的是调用实例变量中包含的东西,请关注这一点。谢谢。

是的,
数组[4]
中的第一个槽位将更改为
Foo

在Java中,一切都是按值传递的。传递对象时,对对象的引用是按值传递的。例如,
array[4]
中包含的对象是从
ar
方法返回的。

来自Java的作者:“Java中只有一种参数传递模式—按值传递—这有助于简化操作。”Ken Arnold和James Gosling的《Java编程语言》第二版,第2.6.1节,第40页,第3段。

Java语言规范:

§4.1有两种数据可以…作为参数传递…:原始值(§4.2)和参考值

§4.3参考值(通常只是参考)是指向这些对象的指针

所以Java是通过“值”、“引用值”、“引用”或“指针”传递的

所有4个版本都受到语言规范的认可

现在我们可以停止这个文字游戏了。我们都知道传递的是什么,这还不够吗?我们叫它pass by rose怎么样?

变量永远不会传递。只传递它们包含的值。也就是说:它是实例变量还是其他变量都没有区别(至少是为了争论“传递了什么”)

请记住,对象就是它本身,没有对象的隐式复制/克隆/复制——这包括数组对象本身(将原语视为自表示的不可变实体)

快乐编码


更新:我找到了这个链接,我很喜欢。这个词是由Liskov创造的

但无论如何,您需要知道的唯一一件事是Python的Java模型既不是“按值调用”也不是“按引用调用”(因为任何尝试使用这些术语[按这些术语思考]…)最准确的描述是CLU的“按对象调用”“按共享调用”“。或者,如果您愿意,“按对象引用调用”。

这总结了不同之处:

“特别是,它不是按值调用的,因为 被调用例程执行的参数的数量将对 调用方。它不是通过引用调用的,因为访问 不提供给调用方的变量,而只提供给某些 对象。”


只有在Java中,“通过共享调用”是通过“传递引用的值”实现的,这是一个不需要考虑的实现细节来描述调用语义、对象或对象标识。

是的,该代码将
数组[4][0]
设置为“Foo”“。事实上,
array
是一个实例变量并不重要。

好吧,我通过运行一个非常简单的测试来回答我自己的问题,但是已经留下的一些答案帮助澄清了很多事情。我懂14种编程语言,所以什么语言做什么有时会变得有点模糊

public class ArrayPassTest {

    private Object[] array;

    public ArrayPassTest()
    {
        array = new Object[10];
        array[4] = new Object[10];
    }

    public Object[] ar(int x)
    {
        return (Object[])array[x];
    }

    public static void main(String[] args) {
        ArrayPassTest apt = new ArrayPassTest();

        apt.ar(4)[0] = "Foo";

        System.out.println(apt.ar(4)[0]);
        System.out.println(apt.ar(4)[5]);

    }

}
产出:

Foo
null

感谢所有的帮助!

最好的思考方法是,除非是原语(数组被视为非原语),否则将传递变量的地址。这将引导您找到运行测试程序得到的答案,并解释原因

(在此上下文中,“按引用”、“按值”、“实例”等术语含义不明确且容易混淆。)

我知道一切都过去了 价值。但我们谈论的是 调用实例中包含的东西 变量,请关注这一点。 谢谢

所有内容都包括“实例变量中包含的内容”


当然,这是显而易见的?

在任何人评论说像
ar(4)[0]
这样的东西不起作用之前,你错了。它起作用了。我只是想在质问者面前说出来。private array[4]=新对象[5];看起来不像是有效的java代码。@armandino是的,我想他是指
array[4]=新对象[5] 
“在任何人发表评论之前…”为什么会有人这样说?不必太偏执。如果有人这样做了,我们其他人会把他们打倒…向poster澄清:变量永远不会传递。只有它们包含的值(见答案)。+1,但我会说“返回了
数组[4]
中包含的对象”因为确实没有“参考”在实现细节之外。关键是要理解一个对象本身,没有复制/克隆/复制,其余的都是纯粹的细节。+1…你说得对,这更清楚一点。我会更新我的答案。我不知道这种说法,但它不值得-1,特别是在有链接支持的情况下。所以…+1:)是的,但是通常使用“参考传递”来表示“参考传递值”(为了清晰起见,我更喜欢使用“pbvr”这个名称).@pst pass by reference表示您可以更改被调用方法中的引用,并且它将在调用方的作用域中更改,这是不会发生的。这就是两者之间的区别。(是的,这可能会非常混乱!)@pst pass by reference和pass reference by value是两件非常不同的事情。“所以Java是pass by”“引用值”或“引用”或“指针”。(忽略原语)“只是