در جاوا همه چیز call by value است، ولی این برای نوعدادههای primitive و اشیا (object) متفاوت است:
-
برای نوعدادههای primitive، به صورت call by value است: یعنی دقیقا مقادیر در پارامترها کپی میشود.
-
برای اشیا call by reference value هست: یعنی مقدار پاس شده برای یک پارامتر، reference آن است.
مثال swap:
public static void swap(Integer x, Integer y)
{
Integer t = x;
x = y;
y = t;
}
public static void main(String[] args)
{
Integer a = 5;
Integer b = 1;
swap(a, b);
System.out.println("a: " + a);
System.out.println("b: " + b);
}
outputs:
a: 5
b: 1
توی عکس زیر مراحل تغییر reference ها اومده (چپ به راست). پس در واقع کاری که این تابع میکنه بازی با reference هاست و نه swap! (دایره کوچک: متغیر، فلش: reference، دایره بزرگ: حافظه تخصیصی به متغیر)
مثال 2:
public static void f(A x, B y){
x = new A(null);
y.setI(2);
}
public static void main(String[] args){
A a = new A("s");
B b = new B(3);
f(a,b);
System.out.println("A.a: " + a.getT());
System.out.println("B.b: " + b.getI());
}
outputs:
A.a: s
B.b: 2
class A{
private String t;
public A(String t){
this.t = t;
}
//setter and getter
}
class B{
private Integer i;
public B(Integer i){
this.i = i;
}
//setter and getter
}
توی عکس زیر مراحل تغییر reference ها اومده (چپ به راست):