Skip to main content

کار با نوع داده های شیء

Working with object data types

در این درس از دوره جامع جاوا، مفاهیم اساسی مرتبط با نوع داده‌های شیء (Object Data Types) بررسی می‌شود. ابتدا تفاوت میان داده‌های اولیه (Primitive Types) و داده‌های شیء (Objects) در جاوا توضیح داده شده و اهمیت استفاده از هر کدام در توسعه برنامه‌ها تحلیل می‌گردد. سپس نحوه تعریف و مقداردهی متغیرهای شیء همراه با کاربردهای رایج آن‌ها مورد بررسی قرار می‌گیرد. در ادامه، کلاس‌های کمکی (Wrapper Classes) نظیر Integer، Double، و Boolean معرفی می‌شوند و کاربرد آن‌ها در تبدیل و مدیریت داده‌ها تشریح می‌شود. همچنین، روش‌های مقایسه و تبدیل داده‌های اولیه به شیء و بالعکس به همراه مثال‌های عملی ارائه می‌گردد. این درس به شما کمک می‌کند تا درک عمیقی از ساختار و عملکرد داده‌های شیء به دست آورید و بتوانید در پروژه‌های خود به‌صورت بهینه از این مفاهیم بهره ببرید.

لینک کمکی (official link) – آشنایی با Object Data Types در جاوا: تفاوت داده‌های اولیه و شیء + کاربردهای Wrapper Classes

تا اینجا، متغیرهای اولیه مثل اعداد، کاراکترها، و مقادیر بولین که در جاوا استفاده میشدند رو برای شما توضیح دادم.

حالا میخواهم به شما بگویم که یک دسته کلی دیگر هم از متغیرها در جاوا داریم که مربوط به اشیاء میشوند.

یک شیء در جاوا یک نمونه از یک کلاس جاوا هست.

زمانی که شما یک متغیر ایجاد میکنید و اون متغیرتان به یک شیء اشاره دارد، در واقع اون متغیر خود شیء نیست، بلکه نمونه ای از اون شیء هست و به اون شیء اشاره میکند و در واقع شما میتوانید چندین متغیر داشته باشید که به یک شیء یکسان در حافظه اشاره داشته باشند. یعنی چندین متغیر از جنس یک شیء در حافظه.

بنابراین، ممکن است یک شیء با نام anObject ایجاد و اعلان کرده باشید و بعد سه تا متغیر متفاوت اعلان کنید که همگی به همین شیء اشاره داشته باشند.

حالا اگر چیزی در محدوده این شیء در حافظه تغییر کند، همه این سه متغیری که به این شیء اشاره دارند هم بروزرسانی میشوند.

حالا برای روشنتر شدن مطلب اینجا یک مثال برای شما میزنم، نگاه کنید من قبلاً یک کلاس جاوا تعریف کردم و الان هم دارید اون رو در این اسلاید می بینید.

نام این کلاس ClothingItem هست، و من اومدم یک متغیر string تعریف کردم که عضوی از این کلاس هست. توجه داشته باشید که این متغیر string کلمه static رو ندارد و در این صورت به این چنین چیزی یک “متغیر نمونه” یا اصطلاحاً instance variable گفته میشود.

همچنین با عنوان فیلد هم از آن یاد میشود. یک متغیر نمونه در واقع عضوی از خود کلاس محسوب نمیشود، بلکه عضوی از یک نمونه از اون کلاس هست.

یعنی که برای اشاره به یک متغیر غیر استاتیک از یک کلاس باید اول یک نمونه از اون کلاس ایجاد بشود و بعد به اون متغیر اشاره بشود و به صورت مستقیم با نام کلاس دردسترس نخواهد بود.

خب؛ همانطور که میبینید در متد main ام، من یک نمونه از کلاس ClothingItem ایجاد کردم.

این خط از کد یک نوع داده دارد، که این نوع داده درواقع نام همین کلاس جاری هست، بعد شناسه، که همان نام متغیر میشه، که اینجا اسمش را گذاشتیم item، و بعد هم کلمه کلیدی new، و بعد در آخر فراخوانی متدی به نام متد سازنده یا constructor.

من بعداً در مورد جزییات متدهای سازنده یا اصطلاحاً constructor methods  ها بیشتر برای شما توضیح میدهم. ولی فعلاً چیزی که باید بدانید این است که چطوری میشود یک نمونه از یک کلاس در جاوا ایجاد کرد و به اینکار instantiation یا ایجاد نمونه گفته میشود.

خب؛ وقتی که نمونه ایجاد شد، متغیرهایی که به عنوان متغیرهای نمونه در کلاس اعلان و تعریف کردید، حالا دیگر در دسترس هستند. پس میتوانم با صدا زدن متغیر یا فیلد type مقداری رو به آن اختصاص بدهم، و اینکار رو در خط بعد انجام دادم، یعنی item.type = “Hat”;.

نمونه های کلاس یا اشیاء، همچنین میتوانند متدهای نمونه داشته باشند، و متد displayItem اینجا یک متد نمونه یا غیر استاتیک هست.

displayItem یک متد هست، و باز هم بدون کلمه کلیدی static و بنابراین این متد عضوی از یک نمونه از یک کلاس محسوب میشود، نه یک عضو خود کلاس. پس باید این متد رو از طریق شیء item صدا بزنیم و بعد این متد اومده اطلاعاتی که متعلق به یک نمونه از کلاس هست رو در خروجی نمایش داده. عبارت this.type یعنی متغیر type که عضوی از نمونه جاری همین کلاس هست. در جاوا همیشه برای اشاره به کلاس جاری ای که داخلش هستیم از کلمه کلیدی this استفاده میشه. یعنی هر موقع داخل یک کلاسی خواستیم به متغیرهای غیراستاتیک، همان کلاس، دسترسی پیدا کنیم از کلمه کلیدی this استفاده میکنیم.

خب؛ متغیر نمونه، instantiation یا ایجاد یک نمونه از یک کلاس، و متد نمونه، سه مبحثی هستند که باید در مورد آنها میدانستید تا بتوانید با کلاس های جاوا به خوبی کار کنید و نمونه هایی که از این کلاس های جاوا ایجاد میشوند، با عنوان اشیاء شناخته میشوند.

یک string در جاوا یک شیء پیچیده هست. که یک نمونه از کلاس string هست.

کلاس string، دقیقاً مثل کلاس های کمکی نوع داده های اولیه عضوی از پکیج java.lang هست.

پس برای استفاده از این کلاس string نیازی نیست که این پکیج رو ایمپورت کنیم یا عبارت خاصی بکارببریم، چرا که؛ این پکیج همیشه در دسترستان هست.

من اینجا یک مثال از ایجاد یک نمونه از کلاس string برای شما آوردم. مجدداً با نوع داده شروع کردم، یعنی String با S بزرگ، بعد اختصاص یک نام یا شناسه، که اینجا string1 گذاشتم. بعد، بعد از علامت مساوی، که عملگر تخصیص هست، کلمه کلیدی new رو دارم، بعد اومدم متد constructor این کلاس رو صدا زدم، و مقدار “hello” رو به آن دادم.

این کدی که در این اسلاید می بینید یک متغیر string ایجاد میکند. کلاس string کمی خاص است، چرا که میتوانید علاوه بر این روش از یک روش میانبر هم استفاده کنید. یعنی دقیقاً همین موردی که در این اسلایدم آنرا می بینید.

کامپایلر این دو عبارت رو دقیقاً عین هم تفسیر میکند: یعنی یک نمونه از کلاس string ایجاد میکند و این مقدار رو به آن اختصاص میدهد. ولی با استفاده از این دستور نحوی، به این شکل، میتوانید کلمه کلیدی new و فراخوانی صریح متد سازنده رو حذف کنید. ولی باز هم میگویم که این دو خط کد برای کامپایلر دقیقاً یک معنی رو میدهد و یک کار رو انجام میدهند.

حالا میخواهم چند تا از ویژگی های مهم دیگر string ها رو برای شما بگویم.

یک string اساساً یک آرایه از کاراکترها است. یک کاراکتر یک نوع داده اولیه هست، و یک string یک شیء پیچیده است.

ولی در صورتی که فرض کنیم، حافظه کافی در کامپیوترمان برای اجرای کدهای مان در اختیار داریم، یک string میتواند هر تعداد کاراکتری که میخواهیم داشته باشد. پس یک string یک مجموعه ای از کاراکترها در یک نظم خاص و با یک چینش خاص هست.

این رشته “Hello!” میتواند یک شیء String باشد ولی میتوانید همین رشته رو به آرایه ای از کاراکترها و مقادیری از جنس Char بشکنید.

یک چیز مهم دیگر که باید در مورد string ها بدانید این است که string ها تغییر ناپذیرند.

این یعنی که یکبار که یک متغیر string رو نمونه سازی و مقداردهی کردید، دیگر اصلاً نمیتوانید آنرا تغییر بدهید. ولی کامپایلر جاوا این تصور رو ایجاد میکند که شما فکر کنید که میتوانید یک متغیر string رو تغییر بدهید. مثلاً، اگر من با یک متغیر با نام StringOne شروع کنم، و مقدار “Hello!” رو به آن اختصاص بدهم، و بعد، در چند خط بعد بگویم که StringOne = “Hello, world!”، به نظر میرسد که مقدار این شیء رو تغییر دادم. ولی درواقع اینطور نیست، و در پسزمینه کار، من مجدداً به شیء اولیه و اورجینال ارجاع دادم. یعنی مجدد شیء اولی رو ایجاد کردم. و حالا اون شیء میتواند طی پروسه ای به نام garbage collection از حافظه پاک بشود، و با اینکار یک شیء جدید با مقدار جدید ایجاد میشود.

برنامه نویس درواقع از garbage collection استفاده نمیکند بلکه از کارهای garbage collection منفعت زیادی میبرد. زبان های برنامه نویسی ای که قابلیت garbage collection ندارند مثل سی و سی پلاس پلاس، برنامه نویس باید هر بار که یک شیء میسازد با دستور new یا malloc  حتماً باید پس از استفاده، اونها رو free کند که اینکار برای برنامه نویس کاری زمانبر است و از همه مهمتر اگر یادش برود free کند برنامه به مرور حافظه زیادی اشغال میکند و در کار برنامه اختلال ایجاد میشود. اما در زبانهای برنامه نویسی که قابلیت garbage collection دارند مثل جاوا و سی شارپ دیگر نیازی به free کردن حافظه نیست و برنامه نویس میتواند تمرکز خودش رو روی کدنویسی بگذارد. محیط های زمان اجرای این زبانها مانند jvm وظیفه free کردن مموری رو با استفاده از الگوریتم های مختلف garbage collection برعهده گرفتند.

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

تغییرناپذیری رشته‌ها در اکثر موارد مشکلی ایجاد نمی‌کند، اما اگر بخواهیم مثلاً در یک حلقه 200 بار محتویات یک متغیر رشته‌ای را تغییر بدهید، اونوقت تعداد زیادی شیء ایجاد شده و در حافظه رها می‌شوند و این مسئله می‌تواند حافظه زیادی اشغال کند که در این موارد از کلاس‌های StringBuilder و StringBuffer استفاده می‌شود.

من اینجا چندتا نمونه دیگر از کار کردن با string ها و کاراکترها آوردم.

در این کلاس، من یک آرایه از کاراکترها تعریف کردم.

عبارت char با کروشه باز و کروشه بسته یعنی یک آرایه. بعد یک متغیر با نام chars دارم، که chars شناسه این متغیر هست، و بعد به طور صریح اومدم با استفاده از یک جفت آکولاد این آرایه رو مقداردهی کردم. هر آیتم در آرایه با یک کاما از آیتم بعدی جدا میشود. هر کاراکتر از کاراکتر literal با استفاده از یک جفت تک کوتیشن مشخص میشود و داخل یک حفت تک کوتیشن قرار میگیرد. حالا میرویم سراغ یک شیء string، من string رو ایجاد کردم، و از متد سازنده string استفاده کردم، و آرایه کاراکتری ام رو هم به آن دادم و نتیجه یک شیء پیچیده خواهد شد.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دوره ها
درس ها
Tha PMIS
طهاکو من
0