آموزش جاوا - اشیاء و کلاس
جاوا یک زبان شیءگرا است. به عنوان یک زبانی که دارای ویژگی شیءگرایی است، جاوا از مفاهیم بنیادی زیر پشتیبانی میکند:
- چندریختی (Polymorphism)
- ارثبری (Inheritance)
- محافظت از دادهها (Encapsulation)
- استخراج (Abstraction)
- کلاسها (Classes)
- اشیا (Objects)
- نمونه (Instance)
- متد (Method)
- انتقال پیام (Message Passing)
در این فصل، به بررسی مفاهیم ،کلاسها و اشیا میپردازیم.
-
شیء (Object) − اشیا وضعیتها و رفتارهایی دارند. مثال: یک سگ وضعیتهایی مانند رنگ، نام، نژاد و رفتارهایی مانند تکان دادن دم، واقع و خوردن دارد. یک شیء نمونهای از یک کلاس است.
-
کلاس (Class) − یک کلاس میتواند به عنوان یک قالب/طرح مشخص کننده رفتار/وضعیتی که شیءهای از نوع آن پشتیبانی میکنند، تعریف شود.
اشیا در جاوا
حال به صورت عمیق به اشیا میپردازیم. اگر به دنیای واقعی نگاه کنیم، میتوانیم بسیاری از اشیا را در اطرافمان مشاهده کنیم؛ خودروها، سگها، انسانها و غیره. تمام این اشیا وضعیت و رفتاری دارند.
اگر به یک سگ فکر کنید، وضعیت آن شامل نام، نژاد، رنگ و رفتار آن شامل وقتزدن، تکان دادن دم و دویدن است.
اگر شیء نرمافزاری را با یک شیء واقعی مقایسه کنیم، خصوصیات بسیار مشابهی دارند.
اشیاء نرمافزاری همچنین وضعیت و رفتاری دارند. وضعیت یک شیء نرمافزاری در فیلدها ذخیره میشود و رفتار آن از طریق متدها نمایش داده میشود.
بنابراین در توسعه نرمافزار، متدها روی وضعیت داخلی یک شیء عمل میکنند و ارتباط شیء به شیء از طریق متدها انجام میشود.
کلاسها در جاوا
کلاس یک قالب است که از آن اشیاء فردی ایجاد میشوند.
مثال زیر نمونهای از یک کلاس است.
مثال
یک کلاس میتواند شامل هر یک از انواع متغیرهای زیر باشد.
-
متغیرهای محلی (Local variables) − متغیرهایی که در داخل متدها، سازندهها یا بلوکها تعریف میشوند، متغیرهای محلی نامیده میشوند. این متغیرها در داخل متد تعریف و مقداردهی میشوند و وقتی متد به پایان میرسد، متغیر از بین میرود.
-
متغیرهای نمونه (Instance variables) − متغیرهای نمونه در داخل یک کلاس ولی خارج از هر متد قرار میگیرند. این متغیرها در زمان نمونهسازی کلاس مقداردهی اولیه میشوند. متغیرهای نمونه از داخل هر متد، سازنده یا بلوک مربوط به آن کلاس قابل دسترسی هستند.
-
متغیرهای کلاس (Class variables) − متغیرهای کلاس در داخل یک کلاس ولی خارج از هر متد با استفاده از کلیدواژه static تعریف میشوند.
یک کلاس میتواند هر تعدادی از متدها را داشته باشد تا به مقدار انواع مختلف متدها دسترسی داشته باشد. در مثال بالا، barking()، hungry() و sleeping() متدها هستند.
موضوعات مهمی که باید در بررسی کلاسهای زبان جاوا مورد بحث قرار گیرند، عبارتند از:
سازندهها (Constructors)
هنگام بحث درباره کلاسها، یکی از زیرموضوعات بسیار مهم سازندهها است. هر کلاس دارای یک سازنده است. اگر ما به صورت صریح یک سازنده برای یک کلاس ننویسیم، کامپایلر جاوا یک سازنده پیشفرض برای آن کلاس ایجاد میکند.
هر بار که یک شیء جدید ایجاد میشود، حداقل یک سازنده فراخوانی خواهد شد. قاعده اصلی سازندهها این است که باید نامی مشابه با نام کلاس داشته باشند. یک کلاس میتواند بیش از یک سازنده داشته باشد.
مثال زیر یک سازنده را نمایش میدهد −
مثال
یک کلاس میتواند شامل هر یک از انواع متغیرهای زیر باشد.
-
متغیرهای محلی (Local variables) − متغیرهایی که در داخل متدها، سازندهها یا بلوکها تعریف میشوند، متغیرهای محلی نامیده میشوند. این متغیرها در داخل متد تعریف و مقداردهی میشوند و وقتی متد به پایان میرسد، متغیر از بین میرود.
-
متغیرهای نمونه (Instance variables) − متغیرهای نمونه در داخل یک کلاس ولی خارج از هر متد قرار میگیرند. این متغیرها در زمان نمونهسازی کلاس مقداردهی اولیه میشوند. متغیرهای نمونه از داخل هر متد، سازنده یا بلوک مربوط به آن کلاس قابل دسترسی هستند.
-
متغیرهای کلاس (Class variables) − متغیرهای کلاس در داخل یک کلاس ولی خارج از هر متد با استفاده از کلیدواژه static تعریف میشوند.
یک کلاس میتواند هر تعدادی از متدها را داشته باشد تا به مقدار انواع مختلف متدها دسترسی داشته باشد. در مثال بالا، barking()، hungry() و sleeping() متدها هستند.
موضوعات مهمی که باید در بررسی کلاسهای زبان جاوا مورد بحث قرار گیرند، عبارتند از:
سازندهها (Constructors)
هنگام بحث درباره کلاسها، یکی از زیرموضوعات بسیار مهم سازندهها است. هر کلاس دارای یک سازنده است. اگر ما به صورت صریح یک سازنده برای یک کلاس ننویسیم، کامپایلر جاوا یک سازنده پیشفرض برای آن کلاس ایجاد میکند.
هر بار که یک شیء جدید ایجاد میشود، حداقل یک سازنده فراخوانی خواهد شد. قاعده اصلی سازندهها این است که باید نامی مشابه با نام کلاس داشته باشند. یک کلاس میتواند بیش از یک سازنده داشته باشد.
مثال زیر یک سازنده را نمایش میدهد −
مثال
اگر برنامه بالا را کامپایل و اجرا کنیم، نتیجه زیر را خواهد داشت −
خروجی
دسترسی به متغیرها و متدهای نمونه (Instance Variables and Methods)
متغیرها و متدهای نمونه از طریق اشیاء ساخته شده قابل دسترسی هستند. برای دسترسی به یک متغیر نمونه، مسیر کامل کیفیت زیر است
مثال
این مثال توضیح میدهد چگونه به متغیرها و متدهای نمونه یک کلاس دسترسی پیدا کنیم.
اگر برنامه بالا را کامپایل و اجرا کنیم، نتیجه زیر را خواهد داشت :
خروجی
قوانین اعلان فایل منبع (Source File Declaration Rules)
به عنوان بخش آخر این بخش، حالا به قوانین اعلان فایل منبع نگاه میکنیم. این قوانین بسیار حائز اهمیت هستند هنگام اعلان کلاسها، دستورات import و دستورات package در یک فایل منبع.
-
تنها میتوان یک کلاس عمومی در هر فایل منبع داشت.
-
یک فایل منبع میتواند شامل چند کلاس غیرعمومی باشد.
-
نام کلاس عمومی باید همان نام فایل منبع باشد و در پایان باید با .java اضافه شود. به عنوان مثال: نام کلاس public class Employee{} است، پس فایل منبع باید به صورت Employee.java باشد.
-
اگر کلاس درون یک بسته (package) تعریف شده باشد، دستور package باید اولین دستور در فایل منبع باشد.
-
اگر دستورات import وجود داشته باشند، آنها باید بین دستور package و اعلان کلاس نوشته شوند. اگر دستورات package وجود نداشته باشند، دستور import باید در خط اول فایل منبع نوشته شود.
-
دستورات import و package برای تمام کلاسهای موجود در فایل منبع اعمال میشوند. امکان داشتن دستورات import و/یا package متفاوت برای کلاسهای مختلف در فایل منبع وجود ندارد.
کلاسها دارای چند سطح دسترسی هستند و انواع مختلفی از کلاسها وجود دارند؛ کلاسهای انتزاعی (abstract classes)، کلاسهای نهایی (final classes) و غیره. در فصل مدیریت دسترسیها درباره همه اینها توضیح خواهیم داد.
علاوه بر انواع کلاسهای ذکر شده، جاوا نیز برخی کلاسهای ویژه به نام کلاسهای داخلی (Inner classes) و کلاسهای ناشناس (Anonymous classes) دارد.
بسته جاوا (Java Package)
به طور ساده، این روشی است برای دستهبندی کلاسها و رابطها. هنگام توسعه برنامهها در جاوا، صدها کلاس و رابط نوشته خواهند شد، بنابراین دستهبندی این کلاسها ضروری است و همچنین زندگی را آسانتر میکند.
دستورات Import
در جاوا، اگر یک نام کامل (fully qualified name)، که شامل بسته و نام کلاس است، داده شود، کامپایلر به راحتی میتواند مکان کد منبع یا کلاس را پیدا کند. دستور import روشی است برای اعلام مکان مناسب برای کامپایلر برای پیدا کردن آن کلاس خاص.
به عنوان مثال، خط زیر به کامپایلر میگوید تمام کلاسهای موجود در دایرکتوری java_installation/java/io را بارگیری کند
یک مورد مطالعه ساده
برای مورد مطالعه ما، دو کلاس ایجاد خواهیم کرد. آنها Employee و EmployeeTest هستند.
اول باز کننده Notepad باشید و کد زیر را اضافه کنید. به یاد داشته باشید که این کلاس Employee است و این کلاس یک کلاس عمومی است. حالا، این فایل منبع را با نام Employee.java ذخیره کنید.
کلاس Employee دارای چهار متغیر نمونه (instance variables) به نامهای name، age، designation و salary است. این کلاس یک سازنده به صورت صریح تعریف شده است که یک پارامتر را دریافت میکند.
مثال
همانطور که پیشتر در این آموزش اشاره شد، پردازش از متد اصلی (main method) شروع میشود. بنابراین برای اجرای این کلاس Employee، باید یک متد اصلی وجود داشته باشد و اشیاء باید ایجاد شوند. ما یک کلاس جداگانه برای این وظایف ایجاد خواهیم کرد.
کلاس EmployeeTest که دو نمونه از کلاس Employee ایجاد کرده و برای هر شیء، مقادیر متغیرها را اختصاص میدهد.
کد زیر را در فایل EmployeeTest.java ذخیره کنید.
حالا هر دو کلاس را کامپایل کنید و سپس EmployeeTest را اجرا کنید تا نتیجه را مشاهده کنید به شکل زیر: