تیکه پاره های جاوا
526 subscribers
93 photos
24 videos
7 files
58 links
سلام خوش اومدید. اینجا یادداشت ها و تکه های جاوا رو کنار هم قرار میدیم :) مطالب کاملا اختصاصی و دستنویس هستند. کپی فقط با ذکر منبع و آیدی کانال❤️

📝برای تدریس پیام دهید
محمدرضا عظیمی‌فرد
🆔 @mrvj475
Download Telegram
💠 در جاوا پارامتر ها چگونه به متد ها ارسال میشوند؟

💬 یکی از مهم ترین سوالات خیلی مهم اینه که آیا جاوا Call By Value هست یا Call By Reference ؟
خب اول باید بگم که جاوا call by value هست. اما این اصطلاحات به چه معناست؟

🔶 در جاوا Call By Value یعنی از مقادیر ورودی به متد(پارامتر های ورودی)، یک کپی گرفته میشود و تمامی اعمال بر روی کپی مقادیر ورودی انجام میشود و نه خود مقادیر ورودی. در نتیجه مقادیر ورودی دچار تغییر نمیشوند. برای مثال:
class Main {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println("a = "+a + "\t b = "+b);
swap(a,b);
System.out.println("swap a and b...");
System.out.println("a = "+a + "\t b = "+b);
}
static void swap(int a,int b){
int temp = a;
a = b;
b= temp;
}
}
—————
⚙️ OUTPUT

a
= 1 b = 2
swap a and b...
a = 1 b = 2
همانطور که میبینید در اصل مقادیر هیچ تغییری ایجاد نشده است.

🔶 در مقابل Call By Reference هم مقادیر ورودی و هم کپی ایجاد شده به یک خانه از حافظه اشاره میکنند. در نتیجه تغییری درون متد اعمال شود، این تغییرات بر روی ورودی تاثیر مستقیم خواهد داشت.( یعنی اگه جاوا call By Reference بود پس متد swap باید برای a و b عمل میکرد )

اما یک ابهام وجود دارد. اینکه چرا در برنامه زیر، مقدار x در آبجکت ذخیره شده به عدد 475 تغییر پیدا میکند؟

class Main {
public static void main(String[] args) {
Test t = new Test(1);
System.out.println("t.x = "+t.x);
changeX(t);
System.out.println("Change X Value...");
System.out.println("t.x = "+t.x);
}
static void changeX(Test t) {t.x = 475;}

}
class Test{
int x;
public Test(int x) {
this.x = x;
}
}
—————
⚙️ OUTPUT

t.x = 1
Change X Value...
t.x = 475


در این حالت هم وقتی یک متغیر از نوع مرجع بعنوان ورودی ارسال میشود، در واقع فقط آدرس آبجکت در حافظه بعنوان کپی فرستاده میشود. در نتیجه از آنجا که هم ورودی و هم کپی ایجاد شده به یک خانه از حافظه اشاره میکنند، تغییر اعمال شده مستقیما بر روی داده های خانه مورد نظر در حافظه اثر میگذارند.


💬 پس اگه ورودی و کپی ایجاد شده هر دو آدرسشون به یه خونه اشاره کنن، این تغییر صورت میگیره اما اگر سعی کنیم آدرس یه آبجکت دیگه رو به متغیر پاس بدیم، روی ورودی اصلی هیچ تغییری اعمال نمیشه. مثلا:
class Main {
public static void main(String[] args) {
Test t = new Test(1);
System.out.println("t.x = "+t.x);
changeObject(t);
System.out.println("Change Object...");
System.out.println("t.x = "+t.x);
}
static void changeObject(Test t) {
t = new Test(10);
}
}
class Test{
int x;
public Test(int x) {
this.x = x;
}
}
—————
⚙️ OUTPUT

t.x = 1
Change Object...
t.x = 1
———
#pass_by_reference #pass_by_value
#call_by_value #call_by_reference
☕️ @PIECEJAVA
👍7