混淆,当一个对象引用被传递的Java是否通过参考值或调用使用呼叫? [重复](Confused,

2019-06-24 19:30发布

这个问题已经在这里有一个答案:

  • 就是Java“传递通过引用”或“传递的价值”? 80个回答
public class program1{

    public static void main(String args[]){

        java.util.Vector vc=new java.util.Vector();

        vc.add("111");
        vc.add("222");

        functioncall(vc);

        vc.add("333");

        System.out.println(vc);

    }

    public static void functioncall(java.util.Vector vc){     

        vc=null;    

    }
}

上述程序的输出是[111222333]。 但是,当我运行下面的程序的输出是[333]。 迷茫的时候,我们传递一个参考,它是如何工作无论是通过参考值或来电通话? 为什么

public class program1{

    public static void main(String args[]){

        java.util.Vector vc=new java.util.Vector();

        vc.add("111");
        vc.add("222");

        functioncall(vc);

        vc.add("333");

        System.out.println(vc);

    }

    public static void functioncall(java.util.Vector vc){

        vc.removeAllElements();  

    }
}

Answer 1:

它通过引用的

要耍赖偷我在这里看到张贴在一段时间前一个比喻,假设每次使用标识符是一张纸,上面写有地址。 地址指向的房子。

你可以换房子(例如,通过将对象添加到载体或清除),但你仍然持同一张纸上,地址仍然需要你同一所房子里。

如果设置为null向量,你正在做的是揉出地址。

这篇文章解释了它在更多的细节。



Answer 2:

你通过VC作为参考副本(总是)。 然后做vc = null;vc = new Vector()你只需要修改从VC本地属性的参考,因此这是正常的,主要的一个没有改变。



Answer 3:

它是值调用。 在这两种情况下,你放的参考参考其中的方法是局部参考方法的参数。



Answer 4:

Java使用对象的引用。 参数为参考值。 因此,它是由值,其中值是对象的引用调用。



Answer 5:

VC是其中包含用于调用该方法的矢量的参考一个新的变量。 更改为null,因为此引用的原始矢量参考副本不影响原始载体。

但因为这是原始矢量的参考任何修改向量实际上改变了原始矢量。 所以Java始终使用呼叫按值,这里的价值恰好是一个参考。



Answer 6:

Java和C 总是由值调用 。 通过引用术语呼吁严格适用于C ++,我们使用&运算符的正式说法。 在对象引用的情况下,引用从实际复制到正式的说法。



Answer 7:

Java编程语言总是值使用电话。 在Java中,所有参数的方法是按值调用或按值传递。 卡·S·霍斯特曼和加里·康奈尔大学已在其名著“Java核心音量 - 我基本原理”中提到了Java编程语言的总是值使用电话。 这意味着该方法获得的所有参数值的副本,并且该方法不能修改传递给它的任何参数变量的内容。 Java的使用两种方法的参数:

  • Java基本类型
  • Java对象引用

这看起来很简单的,简单的,当你尝试通过原始类型的方法,但是当涉及到传递对象的方法变得模糊。 有趣的是,当一个对象引用被传递到的方法,该方法获取对象引用的副本,和原始和正规拷贝指代相同的对象,因此内从该方法的对象参数的状态可被改变。

下面的文章很好地解释了通过值调用和引用调用 。



Answer 8:

按值在Java中通装置中传递值的拷贝传递。 在Java引用传递是指通过地址本身。 在Java参数总是按值传递。 Java的只支持按值传递。

随着Java对象,该对象引用本身是按值传递,因此原来的基准和参数都复制都指向同一个Java对象。 Java的原始太是按值传递。



Answer 9:

在Java“按引用传递”,本身是按值传递的参考。

所以,你不能改变引用本身,但你可以改变物体由参考指向。

所以,你removeAll在电话会议上的行为Vector ,所以你看到的结果。 但是,如果您更改引用本身喜欢:

vc = null

要么,

vc = new Vector();

这些变化指向一个新的(或空)的对象,因此之后的任何变化将不会在物体反射main



Answer 10:

Java的作品withs“的价值理念呼叫”。 如果它的栈和堆被可视化的java然后试图找到任何变量的值在本地工作区,如果它不是在本地找到然后它试图找出对象,它是在堆。

class Foo
{

int x;

public void call(int x)

{

    x++;

}

public static void main(String[] args)

{

       Foo foo = new Foo();

       foo.x = 5;

       System.out.println(foo.x);

       foo.call(foo.x);

       System.out.println(foo.x); 


}


}

上述程序的输出将是:5,5应将描述:在主方法中,x的值是在的参考分配5。为“foo:在呼叫的方法,有一个名为本地变量‘x’在工作区(作为参数传递),所以它值将在其工作区,来改变仅。当从该函数控制返回到主要方法。在主要的工作空间值“x”是仍然5。

class Foo

{

int x;

public void call(int y)

{

    x++;

}

public static void main(String[] args)

{

       Foo foo = new Foo();

       foo.x = 5;

       System.out.println(foo.x);

       foo.call(foo.x);

       System.out.println(foo.x); 

}


}

上述程序的输出将是:5,6

应将描述 :在主方法中,x的值是在的参考分配5为“foo:在呼叫的方法,有一个名为没有本地变量‘x调用‘’在工作区(作为参数传递)所以Java发现它在参照通过该’。函数被调用和的“X”值在那里如图5所示,呼叫方法递增其值设置为“6”,所以它的值将被即“foo”的。当从该函数控制返回到主方法,现在在主工作空间值来改变参考“x”是6因为在这里我们印刷的“x”上FOO参考。

我希望这会帮助您清除您的概念。

问候,苏希尔耆那教



Answer 11:

传址值

实际的参数(或参数表达式)的全面评价,所得到的值被复制到的位置被用于保存方法/函数执行期间正式参数的值。 这个位置是典型的应用程序的运行栈内存块(这就是Java如何处理它),但其他语言可以选择不同的参数存储。

传递通过引用的形式参数只是充当实际参数的别名。 任何时候的方法/函数使用正式的参数(读或写),它实际上是用实际参数。 Java是经过严格按值



文章来源: Confused, whether java uses call by value or call by reference when an object reference is passed? [duplicate]