困惑,java是否在传递对象引用时使用按值调用或按引用调用?

Confused, whether java uses call by value or call by reference when an object reference is passed?

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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]。当我们传递一个引用时很困惑,不管是按值调用还是按引用调用,它是如何工作的?为什么

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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();  

    }
}


IT服务的价值的参考。

两个shamelessly偷analogy广交会在线发布在这里一段时间前,想象你使用的标识符,每一块冰纸业和地址写在它。这两个点的一个房子的地址。

你可以改变你的房子(例如,两个城市的综合矢量对象或清除它),但你仍然持有相同的块地址的纸,还需要和你的一样的房子。

如果你看到两个零矢量的,所有你做的冰擦了他的地址。

这条信息在多explains娱乐零售。


它是呼叫的城市价值。在两个案例,你把两个参考价值的参考方法的说法这是本地的参考方法。


你作为一个参考通VC copy(总是)。 那么做 vc = null;vc = new Vector(),你只要修改的参考从VC的局部属性和它的正常的母猪,一不主的机会。


在Java中传递值意味着传递要传递的值的副本。在Java中传递引用意味着传递地址本身。在Java中,参数总是通过值传递。Java只支持传递值。

使用Java对象,对象引用本身通过值传递,因此原始引用和参数复制都引用相同的Java对象。Java原语也是通过值传递的。


Java和C总是按值调用。引用调用这个术语严格适用于C++,在正式的参数中我们使用ANP运算符。在对象引用的情况下,引用将从实际参数复制到形式参数。


Java编程语言总是使用按值调用。在Java中,方法的所有参数都是按值调用或按值传递。Cay S. Horstmann和Garry Cornell在他们的著名著作"核心Java音量-I基本原理"中提到Java编程语言总是使用按值调用。这意味着该方法获取所有参数值的副本,并且该方法无法修改传递给它的任何参数变量的内容。Java使用两种方法参数:

  • Java原语类型
  • Java对象引用

当您尝试将基本类型传递给一个方法时,它看起来非常直接和简单,但在将对象传递给一个方法时却变得模糊。有趣的是,当一个对象引用传递给一个方法时,该方法会得到一个对象引用的副本,并且原始副本和正式副本都引用同一个对象,因此在方法内部,可以更改对象参数的状态。

下面的文章解释了按值调用和参照调用。


VC是一个新的变量,其中包含的参考向量,这是用来调用的方法。它的两个空的变化不影响原参考向量,因为这冰份原始向量的参考。

但由于这是一个原始的参考矢量的任何修改两个矢量的变化实际上是原始向量。Java总是辨别呼叫SOS值的城市,在这里发生的一个有价值的参考。


辨别的Java对象的证明人。《冰参数的参考值。 所以我的电话在城市价值,价值是一个参考对象。


通过值

实际参数(或参数表达式)将被完全计算,并将结果值复制到一个位置,该位置用于在方法/函数执行期间保存形参的值。该位置通常是应用程序运行时堆栈上的一块内存(Java是如何处理的),但其他语言可以不同地选择参数存储。

通过引用形参只是实际参数的别名。每当方法/函数使用形式参数(用于读取或写入)时,它实际上使用的是实际参数。Java是严格按值传递的


公司设有"Java电话市价值"的概念。如果它的栈和堆冰visualized然后Java tries找到两个变量的值在任何地方workspace,如果它不是发现的地方是它的两个tries查找的对象这是在堆。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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 描述: 在Main方法,价值分配5 x冰在线杂志"foo参考: 在调用方法的局部变量,有叫"X"(通过在workspace AA的说法)。 所以我的价值会改变在其workspace只读。当控制从这个函数返回的两种主要方法。在主的workspace价值仍然"X"5。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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

描述: 在Main方法,价值分配5 x冰在线杂志"foo参考: 在调用方法时,有没有局部变量,名叫"X"(通过在workspace AA的说法)。所以它在Java认定基准,通"呼叫"功能和价值是所谓的"X"有5 increments呼叫方法及其价值的两个"6" 所以我的价值会改变参考,即"foo"。当控制从这个函数返回的两种主要方法。现在,在主的价值workspace冰6"X",因为在这里,我们印制了"X"在foo的参考。

希望这会帮助你明确你的两个概念。

regards, 该)


用JAVA编写的"通市参考参考"、"冰通过城市本身的价值。

所以,你不能改变它的参考,但你可以改变对象的芒两市的参考。

所以你removeAll呼叫行为的Vector所以你看到的结果。但是如果你改变它的类的参考:

1
vc = null

或,

1
vc = new Vector();

这些变化点的两个(或一个新的空对象,所以任何的变化后,将不会是reflected的对象在main