Java中如何传递实参?

简介

大家都知道,向方法传递对象是一件简单的事情。然鹅,在某些情况下,传递对象与传递非对象实参是有些不同的。为了解其间的缘由,你还需要理解两种向子例程传递实参的方法。

夏天悄悄到来了

第一种方法是传值调用(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不使用签名进行重载解析。