Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

‫منظور از call by value و call by reference در جاوا چیست؟ #255

Open
beigirad opened this issue Apr 18, 2021 · 0 comments

Comments

@beigirad
Copy link
Member

beigirad commented Apr 18, 2021

منظور از call by value این است که پارامتری که به یک متد پاس میدهیم درواقع یک مقدار (value) باشد. و call by reference هم یعنی این پارامتر رفرنس یک آبجکت باشد.

در call by value چون خود مقدار را پاس میدهیم پس تغییر دادن آن تاثیری در متغیر مبدا نمیگذارد چون هیچ ارتباطی به متغیر پاس داده شده ندارد. اما در call by reference تغییری که ما روی پارامتر ایجاد میکنیم چون به متغیر اصلی اشاره دارد، آن را تغییر میدهد.

برای فهم بهتر مثال بزنیم:

class Test {
    public static void main(String[] args) {
        int original = 1;
        System.out.println(original); // 1
        doSth(original);
        System.out.println(original); // 1
    }

    static void doSth(int param) {
        param = 12;
    }
}
پس call by reference چی؟

جاوا فقط call by value را ساپورت میکنه.

پس وقتی یک آبجکت پاس میدیم چی میشه؟ مگه اون call by reference نیست؟

پاسخ کوتاهش منفیه

class Test {
    public static void main(String[] args) {
        Person original = new Person();
        original.id = 1;
        System.out.println(original.id); // 1
        doSth(original);
        System.out.println(original.id); // 1
    }

    private static void doSth(Person param) {
        param = new Person();
        param.id = 2;
    }
}

class Person {
    int id;
}
اما جواب بلند:

فکر کنم اینکه که وقتی آبجکت original رو به متد doSth پاس میدیم، داریم رفرنسش رو پاس میدیم برای همه بدیهی باشه. اما نکته اینه که چون جاوا call by value عه، داره خود رفرنس رو کپی میکنه و پاس میده.

اگر به مبحث اشاره‌گرهای cpp آشنایی داشته باشید، انگاری توی اینجا داره یک اشاره‌گر دیگه میسازه و اونو پاس میده.

حالا تا وقتی که این اشاره‌گر جدید (همون رفرنسی که بعنوان پارامتر دریافت شده) به آبجکت original اشاره کنه پس تغییرات ماهم روی original انجام میشه.

اما توی مثال بالا ما داریم رفرنسش رو تغییر میدیم تا به یک آبجکت جدید اشاره کنه. پس تغییرات بعدیمون هم روی آبجکت جدید اعمال میشه. و دیگه ارتباطی با original وجود نداره که بخواد تغییرش بده

منبع
مرتبط با #96

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant