JavaRush /وبلاگ جاوا /Random-FA /انواع داده های مرجع در جاوا

انواع داده های مرجع در جاوا

در گروه منتشر شد
بدون درک نحو جاوا، تبدیل شدن به یک توسعه دهنده جدی غیرممکن است، بنابراین امروز ما به یادگیری نحو ادامه می دهیم. در یکی از مقالات قبلی در مورد متغیرهای اولیه صحبت کردیم، اما از آنجایی که دو نوع متغیر وجود دارد، امروز در مورد نوع دوم - انواع مرجع در جاوا صحبت خواهیم کرد. پس چیست؟ چرا انواع داده های مرجع در جاوا مورد نیاز است؟ انواع داده های مرجع در جاوا - 1بیایید تصور کنیم که یک شیء تلویزیونی با برخی ویژگی ها مانند شماره کانال، حجم صدا و روی پرچم داریم:
public class TV {
   int numberOfChannel;
   int soundVolume;
   boolean isOn;
}
چگونه یک نوع ساده مانند , می تواند intاین داده ها را ذخیره کند؟ بیایید به یاد داشته باشیم: یک متغیر int4 بایت است. اما در داخل دو متغیر (4 بایت + 4 بایت) از یک نوع وجود دارد و همچنین boolean(+1 بایت) ... مجموع - 4 تا 9، اما به عنوان یک قانون، اطلاعات بسیار بیشتری در یک شی ذخیره می شود. چه باید کرد؟ شما نمی توانید یک شی را در یک متغیر قرار دهید. در این مرحله از داستان ما، متغیرهای مرجع ظاهر می شوند. متغیرهای مرجع آدرس محل حافظه را که یک شی خاص در آن قرار دارد ذخیره می کنند. یعنی این یک "کارت ویزیت" با یک آدرس است که با آن می توانیم شی خود را در حافظه مشترک پیدا کنیم و دستکاری هایی با آن انجام دهیم. ارجاع به هر شی در جاوا یک متغیر مرجع است. این چیزی است که با شی تلویزیون ما به نظر می رسد:
TV telly = new TV();
ما یک متغیر از نوع TV را با نام tellyبه پیوندی به شی ایجاد شده از نوع TV تنظیم می کنیم. یعنی JVM حافظه را روی پشته برای آبجکت تلویزیون اختصاص می‌دهد، آن را ایجاد می‌کند و آدرس مکان آن را در حافظه ایجاد می‌کند، آن را در متغیری قرار می‌دهد tellyکه در پشته ذخیره می‌شود. در این سخنرانی می توانید اطلاعات بیشتری در مورد حافظه، یعنی پشته و بسیاری از اطلاعات مفید دیگر بخوانید . یک متغیر از نوع TV و یک شی از نوع TV، متوجه شدید؟ این بی دلیل نیست: اشیاء از یک نوع خاص باید دارای متغیرهای متناظر از همان نوع باشند (بدون احتساب پیاده سازی وراثت و رابط، اما اکنون ما این را در نظر نمی گیریم). بالاخره ما قرار نیست سوپ را در لیوان بریزیم، درست است؟ معلوم می شود که شی ما یک تلویزیون است و متغیر مرجع برای آن مانند یک کنترل پنل است. با استفاده از این کنترل از راه دور می توانیم با شی و داده های آن تعامل داشته باشیم. به عنوان مثال، ویژگی های تلویزیون خود را تنظیم کنید:
telly.isOn = true;
telly.numberOfChannel = 53;
telly.soundVolume = 20;
در اینجا از عملگر نقطه .برای دسترسی و شروع استفاده از عناصر داخلی شی که متغیر به آن اشاره دارد استفاده کردیم. به عنوان مثال، در خط اول به متغیر گفتیم telly: "یک متغیر داخلی isOnاز شی مورد اشاره به ما بدهید و آن را روی true تنظیم کنید" (تلویزیون را برای ما روشن کنید).

تعریف مجدد متغیرهای مرجع

فرض کنید دو متغیر از نوع مرجع و اشیایی که به آنها ارجاع می دهند داریم:
TV firstTV = new TV();
TV secondTV = new TV();
اگر بنویسیم:
firstTV = secondTV;
این بدان معناست که ما متغیر اول را به عنوان یک مقدار یک کپی از آدرس (مقدار بیت های آدرس) به شی دوم اختصاص دادیم، و اکنون هر دو متغیر به شی دوم (به عبارت دیگر، دو کنترل از راه دور برای یکسان) اشاره می کنند. تلویزیون). در همان زمان، اولین شی بدون متغیری باقی ماند که به آن اشاره می کند. در نتیجه، ما یک شی داریم که قابل دسترسی نیست، زیرا متغیر برای آن یک رشته شرطی بود که بدون آن به زباله تبدیل می‌شود، فقط در حافظه قرار می‌گیرد و فضا را اشغال می‌کند. این شیء متعاقباً توسط زباله گرد از حافظه از بین می رود . انواع داده های مرجع در جاوا - 2می توانید رشته اتصال را با یک شی بدون پیوند دیگر بشکنید:
secondTV = null;
در نتیجه، تنها یک پیوند به شی وجود خواهد داشت - firstTVو secondTVدیگر به کسی اشاره نخواهد کرد (که مانع از آن نمی‌شود که در آینده پیوندی به شیء مانند تلویزیون اختصاص دهیم).

کلاس رشته

به طور جداگانه، من می خواهم به کلاس String اشاره کنم . این یک کلاس پایه است که برای ذخیره و کار با داده هایی که به صورت رشته ای ذخیره می شوند طراحی شده است. مثال:
String text = new String("This TV is very loud");
در اینجا ما یک رشته را برای ذخیره در سازنده شی ارسال کرده ایم. اما هیچ کس این کار را نمی کند. پس از همه، رشته ها را می توان ایجاد کرد:
String text = "This TV is very loud";
خیلی راحت تر، درست است؟ از نظر محبوبیت استفاده Stringاز انواع اولیه چیزی کم ندارد، اما همچنان یک کلاس است و متغیری که به آن اشاره می کند، نوع اولیه نیست، بلکه یک نوع مرجع است. ما Stringاین توانایی فوق العاده را برای به هم پیوستن رشته ها داریم:
String text = "This TV" + " is very loud";
در نتیجه، دوباره متن را دریافت خواهیم کرد: This TV is very loudاز آنجایی که دو خط در یک کل ترکیب می شوند و متغیر به این متن کامل اشاره می کند. نکته مهم این است که Stringاین یک کلاس تغییرناپذیر است. چه مفهومی داره؟ بیایید این مثال را در نظر بگیریم:
String text = "This TV";
text = text + " is very loud";
به نظر می رسد همه چیز ساده است: ما یک متغیر را اعلام می کنیم، به آن مقدار می دهیم. در خط بعدی آن را تغییر می دهیم. اما ما واقعاً تغییر نمی کنیم. از آنجایی که این یک کلاس تغییرناپذیر است، در خط دوم مقدار اولیه تغییر نمی کند، اما یک کلاس جدید ایجاد می شود که به نوبه خود از اولین تشکیل شده است + " is very loud".

ثابت های مرجع

در مقاله انواع اولیه به مبحث ثابت ها پرداختیم. وقتی یک متغیر مرجع نهایی را اعلام می کنیم چگونه رفتار می کند ؟
final TV telly = new TV();
ممکن است فکر کنید که این باعث می شود شی غیر قابل تغییر باشد. اما نه، این درست نیست. انواع داده های مرجع در جاوا - 3یک متغیر مرجع با یک اصلاح‌کننده finalبه یک شی خاص بدون توانایی بازکردن آن به هیچ وجه (تعریف مجدد یا معادل کردن آن با null) محدود می‌شود. یعنی بعد از تنظیم مقدار چنین متغیری کدی مانند:
telly = new TV();
یا
telly = null;
باعث خطای کامپایل می شود. یعنی finalفقط روی لینک عمل میکنه و روی خود شی تاثیری نداره. اگر در ابتدا آن را تغییرپذیر داشته باشیم، می‌توانیم حالت داخلی آن را بدون هیچ مشکلی تغییر دهیم:
telly.soundVolume = 30;
گاهی اوقات، متغیرها حتی در آرگومان های متد به عنوان نهایی تعیین می شوند!
public void enableTV (final TV telly){
   telly.isOn = true;
}
این کار به گونه ای انجام می شود که در طول فرآیند نوشتن یک روش، این آرگومان ها نتوانند نادیده گرفته شوند و بر این اساس، سردرگمی کمتری ایجاد کنند. اگر یک متغیر مرجع را نشان دهیم finalکه به یک شیء تغییرناپذیر اشاره می کند چه؟ به عنوان مثال String:
final String PASSWORD = "password";
در نتیجه، یک ثابت، یک آنالوگ از ثابت‌های یک نوع اولیه دریافت می‌کنیم، زیرا در اینجا نه می‌توانیم مرجع را دوباره تعریف کنیم و نه وضعیت داخلی شی (داده‌های داخلی) را تغییر دهیم.

بیایید آن را جمع بندی کنیم

  1. در حالی که متغیرهای ساده بیت‌های ارزش را ذخیره می‌کنند، متغیرهای مرجع بیت‌هایی را ذخیره می‌کنند که نحوه بازیابی یک شی را نشان می‌دهند.
  2. ارجاعات شی فقط برای یک نوع شی اعلان می شوند.
  3. هر کلاس در جاوا یک نوع مرجع است.
  4. مقدار پیش فرض هر متغیر مرجع در جاوا null.
  5. Stringیک نمونه استاندارد از نوع مرجع است. این کلاس نیز تغییرناپذیر است.
  6. متغیرهای مرجع با یک اصلاح کننده finalفقط به یک شیء بدون امکان تعریف مجدد محدود می شوند.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION