MBZ*_*MBZ 27 java terminology parameter-passing pass-by-reference pass-by-value
可能重复: Java是否通过引用传递?
public class myClass{
public static void main(String[] args){
myObject obj = new myObject("myName");
changeName(obj);
System.out.print(obj.getName()); // This prints "anotherName"
}
public static void changeName(myObject obj){
obj.setName("anotherName");
}
}
Run Code Online (Sandbox Code Playgroud)
我知道Java通过值传递,但为什么它obj在前面的示例中通过引用传递并更改它?
Eng*_*uad 103
Java总是按值传递参数,而不是通过引用.在您的示例中,您仍然传递obj其值,而不是引用本身.在您的方法中changeName,您将另一个(本地)引用分配给obj您作为参数传递的同一对象.修改该引用后,您将修改原始引用obj,该引用将作为参数传递.
编辑:
让我通过一个例子解释一下:
public class Main
{
public static void main(String[] args)
{
Foo f = new Foo("f");
changeReference(f); // It won't change the reference!
modifyReference(f); // It will change the object that the reference refers to!
}
public static void changeReference(Foo a)
{
Foo b = new Foo("b");
a = b;
}
public static void modifyReference(Foo c)
{
c.setAttribute("c");
}
}
Run Code Online (Sandbox Code Playgroud)
我将逐步解释这个:
1-声明名为ftype 的引用,Foo并将其分配给Foo具有属性的新对象类型"f".
Foo f = new Foo("f");
Run Code Online (Sandbox Code Playgroud)

2-从方法方面,声明Foo具有名称的类型引用,a并将其初始分配给null.
public static void changeReference(Foo a)
Run Code Online (Sandbox Code Playgroud)

3-在调用方法时changeReference,引用a将分配给作为参数传递的对象.
changeReference(f);
Run Code Online (Sandbox Code Playgroud)

4-声明一个名为btype 的引用,Foo并将其分配给Foo具有属性的新对象类型"b".
Foo b = new Foo("b");
Run Code Online (Sandbox Code Playgroud)

5- a = b是将引用aNOT 重新分配给f其属性为的对象"b".

6-在调用modifyReference(Foo c)方法时,将c创建一个引用并将其分配给具有属性的对象"f".

7- c.setAttribute("c");将更改引用c指向它的对象的属性,并且它是引用f指向它的同一对象.

我希望你现在明白如何将对象作为参数传递在Java中:)
在Java中,对象句柄或对象的标识被视为值.按值传递意味着传递此句柄,而不是对象的完整副本.
术语"通过引用传递"中的"引用"也不表示"引用对象".它表示"引用变量" - 可以存储值的函数定义(或者更确切地说是调用框架)中的命名"存储桶".
通过引用传递意味着被调用的方法可以在调用方法中更改变量值.(例如,在C标准库中,函数以scanf这种方式工作.)这在Java中是不可能的.您始终可以更改对象的属性 - 它们不被视为其"值"的一部分.它们是完全不同的独立物体.
| 归档时间: |
|
| 查看次数: |
24250 次 |
| 最近记录: |