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;
}
}
上述程序的输出为[111,222,333]。但是,当我运行以下程序时,输出为[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();
}
}
答案 0 :(得分:21)
它传递引用的值。
为了无耻地窃取我刚才在这里发布的类比,想象你使用的每个标识符都是一张纸,上面写着地址。地址指向一所房子。
你可以改变房子(例如,通过向对象添加对象或清除它),但你仍然拿着同一张纸,地址仍然会带你到同一个房子。
如果将vector设置为null,那么您所做的就是擦除地址。
This article更详细地解释了它。
答案 1 :(得分:2)
您将vc作为参考副本传递(始终)。
然后做
vc = null;
或vc = new Vector()
,您只需修改vc local属性的引用,因此主要属性没有变化是正常的。
答案 2 :(得分:2)
这是值得召唤。在这两种情况下,你都将 value 引用到方法参数中的引用,这是 local 方法的引用。
答案 3 :(得分:1)
Java使用Object引用。参数是参考值。 所以它是按值调用的,其中value是对象的引用。
答案 4 :(得分:1)
vc是一个新变量,它包含用于调用方法的向量的引用。将其更改为null不会影响原始矢量,因为此引用是原始矢量引用的副本。
但由于这是对原始矢量的引用,因此对矢量的任何修改实际上都会更改原始矢量。所以java总是使用call by value,这里的值恰好是一个引用。
答案 5 :(得分:1)
Java编程语言总是使用按值调用。在Java中,方法的所有参数都是按值调用或按值传递。 Cay S. Horstmann和Garry Cornell在其着名的书“Core Java Volume - I Fundamentals”中提到Java编程语言总是使用按值调用。这意味着该方法获取所有参数值的副本,并且该方法不能修改传递给它的任何参数变量的内容。 Java使用两种方法参数:
当您尝试将原始类型传递给方法时,它看起来非常简单直接,但在将对象传递给方法时变得模糊不清。有趣的是,当对象引用传递给方法时,该方法获取对象引用的副本,并且原始副本和正式副本都引用同一对象,因此在该方法内可以更改对象参数的状态
以下文章很好地解释了Call by value and call by reference。
答案 6 :(得分:1)
Java和C 始终按值调用。术语“引用”一词严格适用于C ++,我们使用&运算符在正式论证中。在对象引用的情况下,引用被从实际参数复制到正式参数。
答案 7 :(得分:1)
在java中传递值表示传递要传递的值的副本。在java中通过引用传递意味着传递地址本身。在Java中,参数始终按值传递。 Java仅支持按值传递。
对于Java对象,对象引用本身是按值传递的,因此原始引用和参数复制都引用相同的Java对象。 Java原语也是按值传递的。
答案 8 :(得分:0)
使用Java"通过引用"传递,引用本身按值传递。
因此,您无法更改引用本身,但可以更改引用指向的对象。
因此removeAll
来电Vector
会对vc = null
进行操作,因此您会看到结果。但是,如果您更改引用本身,如:
vc = new Vector();
,或者
main
这些更改指向一个新的(或null)对象,因此之后的任何更改都不会反映在{{1}}
中的对象中答案 9 :(得分:0)
Java使用" Call by Value concept"。如果它的堆栈和堆是可视化的,那么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 解释: 在main方法中,x的值在" foo的引用上被赋值为5: 在call方法中,在工作空间中有一个名为" x"(作为参数传递)的局部变量。 所以它的值只会在其工作空间中更改。当此函数的控制返回main方法时。在" 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
Desciption : 在main方法中,x的值在" foo的引用上被赋值为5: 在call方法中,在工作空间中没有名为" x"(作为参数传递)的局部变量。所以java在引用中找到它,通过它来调用"调用函数和" x"的值有5,调用方法将其值增加到" 6" 所以它的价值会被改变参考,即" foo"。当此函数的控制返回main方法时。现在在" x"的主要工作空间值中是6因为我们在这里打印了#34; x"在foo参考。
我希望这可以帮助你清除你的概念。
此致 Sushil Jain
答案 10 :(得分:0)
传递按值
完全评估实际参数(或参数表达式),并将结果值复制到用于在方法/函数执行期间保存形式参数值的位置。该位置通常是应用程序的运行时堆栈上的一块内存(这是Java处理它的方式),但其他语言可以选择不同的参数存储。
传递通过引用 形式参数仅用作实际参数的别名。只要方法/函数使用形式参数(用于读取或写入),它实际上使用的是实际参数。 Java严格按值传递