这个问题已经在这里有一个答案:
- 就是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();
}
}
它通过引用的值 。
要耍赖偷我在这里看到张贴在一段时间前一个比喻,假设每次使用标识符是一张纸,上面写有地址。 地址指向的房子。
你可以换房子(例如,通过将对象添加到载体或清除),但你仍然持同一张纸上,地址仍然需要你同一所房子里。
如果设置为null向量,你正在做的是揉出地址。
这篇文章解释了它在更多的细节。
你通过VC作为参考副本(总是)。 然后做vc = null;
或vc = new Vector()
你只需要修改从VC本地属性的参考,因此这是正常的,主要的一个没有改变。
它是值调用。 在这两种情况下,你放的参考值参考其中的方法是局部参考方法的参数。
Java使用对象的引用。 参数为参考值。 因此,它是由值,其中值是对象的引用调用。
VC是其中包含用于调用该方法的矢量的参考一个新的变量。 更改为null,因为此引用的原始矢量参考副本不影响原始载体。
但因为这是原始矢量的参考任何修改向量实际上改变了原始矢量。 所以Java始终使用呼叫按值,这里的价值恰好是一个参考。
Java和C 总是由值调用 。 通过引用术语呼吁严格适用于C ++,我们使用&运算符的正式说法。 在对象引用的情况下,引用从实际复制到正式的说法。
Java编程语言总是值使用电话。 在Java中,所有参数的方法是按值调用或按值传递。 卡·S·霍斯特曼和加里·康奈尔大学已在其名著“Java核心音量 - 我基本原理”中提到了Java编程语言的总是值使用电话。 这意味着该方法获得的所有参数值的副本,并且该方法不能修改传递给它的任何参数变量的内容。 Java的使用两种方法的参数:
这看起来很简单的,简单的,当你尝试通过原始类型的方法,但是当涉及到传递对象的方法变得模糊。 有趣的是,当一个对象引用被传递到的方法,该方法获取对象引用的副本,和原始和正规拷贝指代相同的对象,因此内从该方法的对象参数的状态可被改变。
下面的文章很好地解释了通过值调用和引用调用 。
按值在Java中通装置中传递值的拷贝传递。 在Java引用传递是指通过地址本身。 在Java参数总是按值传递。 Java的只支持按值传递。
随着Java对象,该对象引用本身是按值传递,因此原来的基准和参数都复制都指向同一个Java对象。 Java的原始太是按值传递。
在Java“按引用传递”,本身是按值传递的参考。
所以,你不能改变引用本身,但你可以改变物体由参考指向。
所以,你removeAll
在电话会议上的行为Vector
,所以你看到的结果。 但是,如果您更改引用本身喜欢:
vc = null
要么,
vc = new Vector();
这些变化指向一个新的(或空)的对象,因此之后的任何变化将不会在物体反射main
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参考。
我希望这会帮助您清除您的概念。
问候,苏希尔耆那教
传址值
实际的参数(或参数表达式)的全面评价,所得到的值被复制到的位置被用于保存方法/函数执行期间正式参数的值。 这个位置是典型的应用程序的运行栈内存块(这就是Java如何处理它),但其他语言可以选择不同的参数存储。
传递通过引用的形式参数只是充当实际参数的别名。 任何时候的方法/函数使用正式的参数(读或写),它实际上是用实际参数。 Java是经过严格按值
文章来源: Confused, whether java uses call by value or call by reference when an object reference is passed? [duplicate]