PDA

View Full Version : سوال: سوال درباره ارسال شی یه متد



poker97
سه شنبه 11 اسفند 1394, 15:22 عصر
سلام دوستان میشه توضیح بدین تو این کد چرا تو متد swap1 شعاع دایره ها عوض نمیشه؟؟
public class Test {
public static void main(String[] args) {
Circle circle1 = new Circle(1);
Circle circle2 = new Circle(2);
swap1(circle1, circle2);
System.out.println("After swap1: circle1 = " + circle1.radius + " circle2 = " + circle2.radius);
swap2(circle1, circle2);
System.out.println("After swap2: circle1 = " + circle1.radius + " circle2 = " + circle2.radius);
}

public static void swap1(Circle x, Circle y) {
Circle temp = x;
x = y;
y = temp;
}

public static void swap2(Circle x, Circle y) {
double temp = x.radius;
x.radius = y.radius;
y.radius = temp;
}
}
class Circle {
double radius;

Circle(double newRadius) {
radius = newRadius;
}
}

محمد فدوی
پنج شنبه 13 اسفند 1394, 17:17 عصر
در جاوا، همیشه پاس کردن اشیاء با ارجاء (By Reference) انجام می‌شه ولی با این حال خود اشاره‌گر به شیٔ با مقدار (By Value) پاس می‌شه که برای افراد ناآشنا یکم گیج‌کننده‌ست. یه مثال می‌زنم:

Circle c1 = new Circle(10);
Circle c2 = c1;

الان c1 و c2 به یه شیٔ اشاره می‌کنن، ولی خودشون به عنوان اشاره‌گر، دوتا چیز جدا هستن! مثلا اگه شعاع c1 رو تغییر بدم، شعاع c2 هم تغییر می‌کنه.. اما اگه کلا c1 رو مجددا از اول مقداردهی کنم اصلا c2 متوجه این اتفاق نمی‌شه:

c1.radius = 12;
System.out.println(c2.radius); // OUT: 12

c1 = new Circle(14);
System.out.println(c2.radius); // OUT: 12

اتفاقی که توی فراخوانی متدها می‌افته دقیقا همینه. موقع فراخوانی متد swap1، در واقع x به همون شیٔی اشاره می‌کنه که circle1 اشاره می‌کنه و y هم دقیقا به شیٔی اشاره می‌کنه که circle2 اشاره می‌کنه، ولی اگه x و y خودشون از ابتدا مقداردهی بشن مقادیر circle1 و circle2 تغییری نمی‌کنه. در حالی که اگه radius در x و y تغییر کنه مسلما circle1 و circle2 هم دچار تغییر می‌شن.