English 中文(简体)
模糊, 是否 java 使用按值调用, 还是在通过对象引用时以引用调用? [重复]
原标题:Confused, whether java uses call by value or call by reference when an object reference is passed? [duplicate]
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();  

    }
}
最佳回答

它通过引用的value

为了无耻地偷取我刚才在这里看到的一个类比,想象一下,你使用的每个识别码都是一张纸,上面写着一个地址。地址指向一栋房子。

您可以更改房屋(例如,通过在矢量上添加对象或清除它),但您仍然持有同一张纸,地址仍然将您带到同一房子。

如果您设置向量为空, 您要做的就是擦掉地址 。

"http://javadude.com/articles/passbyvalue.htm" rel="noreferrer" >此条 更详细地解释了这一点。

问题回答

You pass vc as a reference copy (always). Then doing vc = null; or vc = new Vector(), you just modify the reference from the vc local attribute and so it s normal that the main one didn t change.

Java uses Object references. The argument is reference value. So it s call by value, where value is a reference for objects.

这是按值调用。在两种情况下,您都输入了方法参数中 value 的引用,即方法参数的 local 引用。

Java 编程语言总是使用按值调用。 在 Java 中, 方法的所有参数都是按值或通过值调用。 Cay S. Horstmann 和 Garry Cornell 在其著名的书“ Core Java volution- I Fasics ” 中提到, Java 编程语言总是使用按值调用。 这意味着该方法获得所有参数值的复制件, 而该方法无法修改传递到它的任何参数变量的内容 。 Java 使用两种方法参数 :

  • Java primitive types
  • Java object references

当实验将原始类型传递到一种方法时,它看起来非常直观和简单,但当将对象传递到一种方法时却变得模糊不清。有趣的是,当对象引用传递到一种方法时,该方法会得到对象引用的副本,而正本和正本都指同一对象,因此从方法上看,对象参数的状态可以改变。

以下文章很好地解释了按价值和参考 调用。

vc 是一个新变量,它包含用于调用该方法的矢量的引用。将矢量修改为空不会影响原始矢量,因为此引用是原矢量引用的复制件。

但因为这是原始矢量的引用, 任何对矢量的修改实际上都会改变原始矢量。 所以 Java 总是使用按值调用, 这里这个值恰好是一个引用 。

Java 和 C 按值 < strong > 总是调用 < / strong > 。 在正式参数中使用 & amp; 运算符的 C++ 中, 引用的术语严格适用于 C++ 。 在对象引用中, 引用会被复制到实际参数到正式参数 。

在 java 中, 通过 value 表示通过一个要传递的值。 通过 java 表示通过 地址 。 在 Java 中, 参数总是通过 value 。 Java 表示只支持通过 value 。

对于 Java 对象, 对象引用本身会以值传递, 所以原始引用和参数副本都指同一 Java 对象。 Java 原始对象也会以值传递 。

以 Java “ 参考通过 ”, 参考文件本身由数值传递 。

因此,您不能更改引用本身,但您可以更改引用指向的对象。

您的 removeall 调用 Vector 上的动作, 使您看到结果。 但是, 如果您更改引用本身如 :

vc = null

或,

vc = new Vector();

这些修改指向一个新的(或空)对象,所以此后的任何修改都不会反映在 main 中的对象中。

Java与“按价值计算”概念一起工作。如果它的堆叠和堆积被可视化,那么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); 


}


}

Output of above program would be : 5 , 5 Desciption : In main method, value of x is assigned 5 on reference of "foo: In call method, there is local variable named "x"(passed as argument) in workspace. so it s value would be changed in its workspace only. when control from this function returns to main method. In main s workspace value of "x" is still 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 : In main method, value of x is assigned 5 on reference of "foo: In call method, there is no local variable named "x"(passed as argument) in workspace. So java finds it in reference through which "call" function was called and value of "x" is there 5, call method increments its value to "6" so it s value would be changed reference i.e. "foo". when control from this function returns to main method. Now In main s workspace value of "x" is 6 because here we printed "x" on foo reference.

我希望这将有助于你澄清你的概念。

Regards, Sushil Jain

超过值

对实际参数( 或参数表达式) 进行了充分评价, 并将结果的值复制到一个位置, 用于在方法/ 功能执行期间持有正式参数 s 值。 该位置通常是该应用程序运行时堆叠上的内存块( 即 Java 如何操作), 但其他语言可以选择不同的参数存储 。

Pass-by-reference The formal parameter merely acts as an alias for the actual parameter. Anytime the method/function uses the formal parameter (for reading or writing), it is actually using the actual parameter. Java is strictly pass-by-value





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签