Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的按引用传递_Java - Fatal编程技术网

java中的按引用传递

java中的按引用传递,java,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 &&

我是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给出的调用者函数中的值?

Java是一种传递值语言。无法通过引用传递变量。但是,当传递对象(与原语相反)时,引用就是通过值传递的对象

由于
int a
int b
是原语,因此对它们所做的任何更改都不会反映在方法的范围之外。但是,您对
myclass obj1
myclass2 obj2
所做的更改将反映在方法之外,因为它们是对象


编辑:正如Brian和Matteo所指出的,如果您将
obj1
obj2
重新分配给
myclass
的新实例,则在方法之外不会生效。只有原始引用的突变将被保留。这是因为传递给方法的是对原始对象的引用,而不是对被调用函数
obj1
obj2
中原始变量
obj1
obj2
的引用。整数值
a
b
不会更改
函数将传递
布尔值作为结果。

Java通过值传递方法参数,而不是通过引用<代码>可以修改
,因为它们没有声明为
final
,但在调用者中不会更改值。

在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"

在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     
}

你所说的“在被调用的函数中进行更改”是什么意思?我不明白你所说的“在被调用的函数中也进行更改的方法有哪些?”。Java也没有“函数”,只有“方法”。无论如何,在Java中,对象是按值作为指针传递的,并且没有办法更改它。的可能重复。只需查看页面右侧的所有相关问题。您可以使用
obj1
obj2
的方法。这还不完整。对原始obj1和obj2所做的更改将反映在外部。但是,如果重新指定obj1或obj2,则在外部将看不到任何更改。@Matteo:是,这是正确的。在这一点上,我会把我的答案改得更明确一点。@dbyrne我只是想避免一些头痛。。。为什么重新分配不反映在外部?:-)