java中的按引用传递
我是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 &&
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我只是想避免一些头痛。。。为什么重新分配不反映在外部?:-)