Java 传递参数的方式:值传递

Java uses exactly one mode of passing arguments: pass-by-value.
同Python,Java也是以pass-by-value的方式传递参数,Java任何时候都是传值,原生类型和数据都一样。对象的位置称为“引用”,当传递对象的值时,实质上传递的是对象的引用。

public static void main(String[] args) {
    Dog aDog = new Dog("Max");
    // we pass the object to foo
    foo(aDog);
    // aDog variable is still pointing to the "Max" dog when foo(...) returns
    aDog.getName().equals("Max"); // true, java passes by value
    aDog.getName().equals("Fifi"); // false 
}

public static void foo(Dog d) {
    d.getName().equals("Max"); // true
    // change d inside of foo() to point to a new Dog instance "Fifi"
    d = new Dog("Fifi");
    d.getName().equals("Fifi"); // true
}

上面的例子:aDog.getName() 返回“Max”, main里的aDog的值没有变成Fifi,因为对象的引用是通过值传递的,如果是通过引用传递的,那么main里的aDog.getName()foo函数调用后,将返回“Fifi”

同样:

public static void main(String[] args) {
    Dog aDog = new Dog("Max");
    foo(aDog);
    // when foo(...) returns, the name of the dog has been changed to "Fifi"
    aDog.getName().equals("Fifi"); // true
}

public static void foo(Dog d) {
    d.getName().equals("Max"); // true
    // this changes the name of d to be "Fifi"
    d.setName("Fifi");
}

上面的例子,在调用foo(aDog)后,狗的名字变成Fifi,因为对象的名字在函数foo()内部被设置。food上执行的任何操作都是执行于aDog自身。


传递对象作为实参的另一个例子:

public class Main{
     public static void main(String[] args){
          Foo f = new Foo("f"); //(1)
          changeReference(f); // (3) It won't change the reference!
          modifyReference(f); // It will modify the object that the reference variable "f" refers to!
     }
     public static void changeReference(Foo a){ // (2)
          Foo b = new Foo("b"); // (4)
          a = b;  // (5)
     }
     public static void modifyReference(Foo c){  // (6)
          c.setAttribute("c"); // (7)
     }
}

逐步说明:
(1). 声明一个类型为Foo, 名为f的引用,并将它赋给一个类型为Foo的具有属性"f"的新的对象:

Foo f = new Foo("f");

(2). 声明一个类型为Foo名为a的引用,初始化为null

public static void changeReference(Foo a)

(3). 调用方法changeReference时,引用a将被赋给被传递进来用作实参的对象。

changeReference(f);

(4).声明一个类型为Foo,名称为b的引用,并将它赋给一个类型为Foo并具有属性“b”的新的对象。

Foo b = new Foo("b");

(5). a = b 重新将引用a而不是f赋给属性为“b”的对象。
(6).当调用 modifyReference(Foo c)方法时, 引用c被创建,并被赋给属性为“f”的对象。
(7).c.setAttribute("c");将改变引用c指向的对象的属性,此对象也是引用f指向的对象。

开头的例子就能说明问题,这个新的例子没有多少新意。


[1]https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value
[2]https://stackoverflow.com/questions/11102878/swapping-function-java-pass-by-value-code-failed

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值