کلاسها/اشیاء (Java Classes/Objects)
کلاسها و اشیاء: الگو و نمونه 🏗️✨
برای درک کلاس و شیء، تصور کنید یک "نقشه مهندسی" برای ساخت ساختمان دارید. نقشه خودش ساختمان نیست، بلکه توصیفی از آن است. جادهها و دیوارهایی که بر اساس آن نقشه ساخته میشوند، "اشیاء" واقعی هستند.
۱. کلاس (Class) چیست؟
کلاس یک Template یا الگوی کدنویسی است که ویژگیها (Attributes) و رفتارهای (Methods) یک موجودیت را تعریف میکند.
{code_block('public class Car {\n int speed;\n String model;\n}')}۲. شیء (Object) چیست؟ 🏎️
شیء یک نمونه (Instance) واقعی از کلاس است که در حافظه ساخته میشود. هر شیء مقادیرِ مخصوص به خودش را دارد.
{code_block('public class Main {\n public static void main(String[] args) {\n Car myCar = new Car(); // ساخت شیء\n myCar.speed = 120;\n System.out.println(myCar.speed);\n }\n}')}new برای ایجاد یک شیء جدید در حافظه استفاده میشود.
۳. داشتن چندین شیء
شما میتوانید از روی یک کلاس، هزاران شیء مستقل بسازید. تغییر در یکی، تاثیری روی دیگری ندارد:
{code_block('Car bmw = new Car();\nCar benz = new Car();\nbmw.speed = 200;\nbenz.speed = 180;')}توصیه مهندسی:
معمولاً برای نظم بهتر، کلاسها را در فایلهای جداگانه تعریف میکنند. نام فایل باید دقیقاً مشابه نام کلاس باشد.
myCar خودِ ماشین نیست، بلکه آدرسِ محل استقرار ماشین در حافظه است.
بخش تخصصی: مهندسی شیءگرایی و مدیریت حافظه 🏗️💎
در این بخش، به مفاهیمی میپردازیم که برای درک فیزیکیِ اتفاقاتِ پشت صحنه در جاوا ضروری هستند.
۱. کالبدشکافی شیء در حافظه Heap
زمانی که شما با دستور new یک شیء میسازید، جاوا بخشی از حافظه Heap را به آن اختصاص میدهد. هر شیء دارای یک "Header" است که شامل اطلاعات مدیریتی جاوا (مثل اطلاعات Garbage Collection) است و سپس فیلدها و دادههای شیء قرار میگیرند. متغیرِ شما در واقع فقط یک "آدرس" یا رفرنس به این منطقه از حافظه را در خود دارد.
۲. مدیریت چرخه عمر اشیاء (Garbage Collection)
برخلاف زبانهایی مثل ++C، در جاوا شما نیازی به حذف دستی اشیاء ندارید. وقتی هیچ متغیری به یک شیء اشاره نکند (مثلاً ریفرنس آن null شود)، آن شیء "یتیم" میشود. Garbage Collector به صورت خودکار این اشیاء را شناسایی کرده و حافظه آنها را برای استفادههای بعدی آزاد میکند.
۳. کدهای تمیز: جداسازی State و Behavior
یک کلاس خوب، کلاسی است که وضعیت (Attributes) را از رفتار (Methods) به درستی تفکیک کند. متغیرهای کلاس باید فقط دادههایی را نگه دارند که ذاتِ آن موجودیت را تعریف میکنند. افراط در تعریف Attributes باعث سنگین شدن اشیاء و پیچیدگی در تستنویسی میشود.
تمرینهای عملی
برای تثبیت یادگیری این درس تمرینهای زیر را حل کنید
یک کلاس به نام Phone از قبل تعریف شده است. در متد main، یک شیء از این کلاس به نام myPhone با استفاده از new بسازید.
class Phone {
String brand = "Apple";
}
public class Main {
public static void main(String[] args) {
Phone myPhone = new Phone();
System.out.println(myPhone.brand);
}
}
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.