محسن نوری اردستانی | Mohsen Noori Ardestani
محسن نوری اردستانی | Mohsen Noori Ardestani
خواندن ۲ دقیقه·۲ سال پیش

Method Invocation( #call_By_Value #call_By_Ref )

سوال_مصاحبه_method_invocation
تفاوت فراخوانی متود به روش call_By_Value و call_By_Ref را بیان کنید؟ زبان جاوا کدام حالت بالا را انجام میدهد؟ برای هرحالت مثال بزنید. انواع ValueType و RefType را با مثال شرح دهید. محل تعریف و ذخیره_سازی هرکدام از این انواع کجا می:باشد؟ garbage_collector به چه صورت با این حافظه ها برخورد میکند؟

جواب:
?️به داده ای ValueType گفته میشود که مقدار متغیر به طور مستقیم در آن جایگاه نکهداری میشود. انواع معروف vlaueTypeها عبارتند از: bool - enum - short - double - int - char - float -byte - decimal

?️ارسال با مقدار یا callByValue به این صورت است که وقتی آرگمان ورودی یک متود valueType باشد، سیستم یک کپی جداگانه ایجاد کرده و آن را برای متود میفرستد. بنابراین اگر تغییری در مقدار متغیر متود اعمال شود ، روی مقدار اصلی هیچ تاثیری ندارد.

?️برخلاف valueType ها، refrenceType ها مقادیرشان به طور مستقیم در خود ذخیره نمیشود درعوض آنها آدرس مکانی از حافظه را که مقدار در آن ذخیره شده است را در خود دارند، به عبارت دیگر refrenceType ها شامل یک اشاره_گر هستند که به مکانی دیگر از حافظه اشاره میکند که مقدار در آن ذخیره شده است. انواع این داده عبارتند از: String - Class - Delegates - تمام آرایه ها حتی اگر مقدار آنها از نوع valueType باشد.

?️وقتی ارسال با ارجاع یا callByRef انجام میدهیم دیگر کپی از آن ساخته نمیشود در عوض آدرس آن متغیر به متود ارسال میشود. برای همین میتوان به راحتی آدرس اشاره گر آن را عوض کرد و مقدار آن را تغییر داد.

?️محل تعریف و ذخیره_سازی valueType ها روی حافظه Stack هست برای مثال یک متغیر از نوع int32 چهار بایت از حافظه stack را گرفته است.

?️محل تعریف refrenceType ها درون حافظه stack میباشد ولی مقدار آنها در حافظه ی managed heap نگهداری میشود یعنی درون srack فقط آدرسی (refrence) از managed heap نگهداری میشود.

?️در حافظه stack فضای کمتری وجود دارد ولی سرعت کار آن بالاست، در حافظه managed heap فضای بیشتری وجود دارد ولی سرعت آن کمی پایین_تر است.

?️لازم به ذکر است که جاوا از لحاظ فنی کاملا به صورت CallByValue عمل میکند یعنی حتی در حالت ارسال با ارجاع هم هیچ تغییری در مقدار متغییر اصلی نمیدهد .

?️مدیریت حافظه توسط Garbage_Collector حافظه managed heap را بررسی میکند و اگر به ازای هرکدام از آنها در stack آدرسی وجود نداشته باشد ، حافظه را آزاد میکند.

زبان جاوا
برنامه نویس سمت وب و موبایل - علاقه مند به پژوهش
شاید از این پست‌ها خوشتان بیاید