我是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给出的调用函数中的值?
答案 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 a
和int b
是基元,因此您对其所做的任何更改都不会反映在方法范围之外。但是,您对myclass obj1
和myclass2 obj2
所做的更改将反映在方法之外,因为它们是对象。
编辑:正如Brian和Matteo指出的那样,如果您将obj1
或obj2
重新分配给myclass
的新实例,这将不会在该方法之外生效。只保留原始参考文献的突变。这是因为对原始对象的引用是传递给方法的内容,而不是对原始变量obj1
和obj2
的引用。
答案 2 :(得分:1)
是通过副本(原始类型和对象引用)传递的,因此以下代码对调用者没有任何影响
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
也将被更改。整数值a
和b
不会更改。
该函数将提供boolean
作为结果。
答案 4 :(得分:0)
Java按值传递方法参数,而不是通过引用传递。可以修改a
,因为它们未声明为final
,但调用者中的值不会更改。