在java中通过引用传递

时间:2011-11-03 16:15:00

标签: java

我是java的新手。我试图搜索我的查询但找不到。如果你知道,请帮助我。我有一个功能:

boolean func(int a, int b, myclass obj1, myclass2 obj2)
{
    ...
}

   void caller() {
   int a = 0, b=0;
   myclass obj1 = null;
   myclass1 obj2 = null;
   func(a,b,obj1,obj2);
   if (a == 5 && b ==2)
  {
   ...
 }
}

我该怎么做才能使所有传递的变量都具有函数func给出的调用函数中的值?

5 个答案:

答案 0 :(得分:3)

在Java中,一切都是按值传递的,没有例外。

如果传递对象(每个非基本变量都是)的引用,那么也会复制这些引用。然后,您可以为这些参数分配新对象,但这些更改不会反映在调用方法中。

但是,如果更改传递的对象(例如,更改该对象的属性),您也会在调用方法中看到这些更改。

示例:

class Person {
  public String name; //note that public here is generally bad practice but it's here for simplicity's sake
}

public void someMethod(Person p) {
  p.name = "Bob"; //this will be visible to the caller since you change the object
  p = new Person(); //this won't be visible to the caller since you change the reference     
}

答案 1 :(得分:1)

Java是一种值传递语言。无法通过引用传递变量。但是,当您传递一个对象(而不是一个基元)时,引用就是通过值传递的内容。

由于int aint b是基元,因此您对其所做的任何更改都不会反映在方法范围之外。但是,您对myclass obj1myclass2 obj2所做的更改将反映在方法之外,因为它们是对象。

编辑:正如Brian和Matteo指出的那样,如果您将obj1obj2重新分配给myclass的新实例,这将不会在该方法之外生效。只保留原始参考文献的突变。这是因为对原始对象的引用是传递给方法的内容,而不是对原始变量obj1obj2的引用。

答案 2 :(得分:1)

Java参数中的

是通过副本(原始类型和对象引用)传递的,因此以下代码对调用者没有任何影响

void func(int a, Object o) {
  a = 0;
  o = null;
}

int i = 10;
Object p = "hello";
func(i, p);
// i is still 10, p is "hello"

但是,引用的对象是相同的,你可以更新它...所以这段代码确实对调用者有效:

class Person {
  String name;
}

void func(Person p) {
  p.name = "myName";
}

p.name = "yourName";
func(p);
// p.name is "myName"

答案 3 :(得分:0)

在被叫函数obj1中,obj2也将被更改。整数值ab不会更改。

该函数将提供boolean作为结果。

答案 4 :(得分:0)

Java按值传递方法参数,而不是通过引用传递。可以修改a,因为它们未声明为final,但调用者中的值不会更改。