Java中如何传递实参?
- 2020 年 4 月 2 日
- 筆記
简介
大家都知道,向方法传递对象是一件简单的事情。然鹅,在某些情况下,传递对象与传递非对象实参是有些不同的。为了解其间的缘由,你还需要理解两种向子例程传递实参的方法。
夏天悄悄到来了
第一种方法是传值调用(call-by-value)。这种方法吧实参值复制到子例程的形参中。因此,对子例程形参的修改不会影响调用中的实参。第二种传递实参的方法是引用调用(call-by-reference)。在这种方法中。传递给形参的是实参的引用(不是实参值)。在子例程内部,这个引用被用于访问调用中指定的实参。这就意味着对形参的修改会影响用于调用子例程的实参。你将看到,虽然Java使用传值调用来传递实参,但是传递基本类型与传递引用类型的效果是不同的。
丘比特爱神之箭
当向方法传递基本类型时,如 int 或 double ,传递的是值,因此将创建实参的副本,无论接收实参的形参发生什么事情,都不会对方法以外产生影响。例如:
(可以左右滑动查看)
class Test{ void noChange(int i,int j){ i = i + j; j = -j; } } class CallByValue{ public static void main(String srgs[]){ Test ob = new Test(); int a = 15, b = 20; System.out.println("a and b before call: " + a + " " + b); ob.noChange(a,b); System.out.println("a and b after call: " + a + " " + b); } }
程序的输出如下所示:
a and b before call: 15 20 a and b after call: 15 20
如你所见,在noChange()内部发生的运算没有影响调用中使用的 a 和 b 的值。
夏季喝冷饮最配哦~
当向方法传递对象时,情况就不大一样了,因为对象是通过引用来传递的。切记,当创建类类型的变量时,就在创建对象的引用。实际传递给方法的是引用而不是对象本身。因此,当向方法传递引用时,接收引用的形参与实参会指向同一对象。这就意味着向方法传递对象使用的时引用调用。方法内部对对象的修改就会影响作为实参的对象。例如:
(可以左右滑动查看)
class Test{ int a, b; Test(int i, int j){ a = i; b = j; } void change(Test ob){ ob.a = ob.a + ob.b; ob.b = -ob.b; } } class PassObRef{ public static void main(String args[]){ Test ob = new Test(15, 20); System.out.println("ob.a and ob.b before call: " + ob.a + " " + ob.b); ob.change(ob); System.out.println("ob.a and ob.b after call: " + ob.a + " " + ob.b); } }
程序的输出如下所示:
ob.a and ob.b before call: 15 20 ob.a and ob.b after call: 35 -20
如你所见,change()内部的动作影响了作为实参使用的对象。
记住,当对象引用被传递给方法时,引用本身时使用传值调用方式传递的。然鹅,因为被传递的值引用了一个对象,所以该值的副本依然引用了被相应实参引用的同一个对象。
每周
问答
问:我听Java程序员提到过“签名”这个术语,它指的是什么?
答:在Java中,签名(signature)指的是方法名及其形参列表。因此,在重载时,一个类中的两个方法不能具有相同的签名。注意,签名不包含返回类型,因为Java不使用签名进行重载解析。