آموزش شی گرایی در جاوا به زبان ساده + مثال عملی
فرض کنید میخواهید یک بازی ساده بسازید. در این بازی، قرار است یک ماشین بتواند در محیطی حرکت کند. خب، برای ساخت این بازی به چه المانهایی نیاز دارید؟ مسلما به یک ماشین و محیطی که ماشین در آن حرکت میکند. این ماشین و محیط، همان اشیاء هستند که در این مطلب از مجله مکتوب به مفهوم شی گرایی در جاوا خواهیم پرداخت.
شی گرایی در جاوا چیست؟
شی گرایی در جاوا چیست؟ برنامهنویسی شیءگرا (Object-Oriented Programming – OOP) نوعی پارادایم برنامهنویسی محسوب میشود که بر اساس مفهوم اشیاء بنا شده است. در این رویکرد، ما دنیای واقعی را به اجزای کوچکتر به نام شیء (Object) تقسیم میکنیم. هر شیء ویژگیهای خاص خودش (صفات یا Attribute) را دارد و میتواند کارهای خاصی را انجام دهد (رفتار یا Method).
برگردیم به مثال ماشینمان. ویژگیهای این ماشین میتوانند شامل رنگ، سرعت، مدل و غیره باشند. رفتارهای آن نیز میتواند شامل حرکت کردن، ترمز کردن، بوق زدن و غیره باشد.
چرا شی گرایی در جاوا مهم است؟
برنامهنویسی شیءگرا مزایای متعددی نسبت به رویکردهای سنتی دارد. بیایید ببینیم این مزایا چه هستند:
- سازماندهی بهتر: با تقسیم کد به اشیاء مجزا، کد شما خواناتر، قابل فهمتر و سازماندهیشدهتر میشود. تصور کنید کد بازی شما به جای اینکه یک تکه بزرگ و پیچیده باشد، به بخشهای مجزا برای ماشین و محیط بازی تقسیم شده باشد. قطعا کار کردن با چنین کدی بسیار راحتتر است.
- استفاده مجدد: با تعریف اشیاء، میتوانید آنها را در بخشهای مختلف برنامه خود یا حتی پروژههای دیگر دوباره استفاده کنید. مثلا اگر بعدا بخواهید در بازی خود یک موتورسیکلت هم اضافه کنید، میتوانید از بسیاری از ویژگیها و رفتارهای ماشین (مثل حرکت کردن و ترمز کردن) برای موتورسیکلت هم استفاده کنید.
- نگهداری آسانتر: هنگامی که میخواهید بخشی از برنامه خود را تغییر دهید، به لطف شیءگرایی، فقط لازم است کد مربوط به آن شیء را تغییر دهید. این موضوع باعث میشود نگهداری و بروزرسانی برنامه شما بسیار سادهتر شود.
- ایجاد مدلهای واقعی: شیءگرایی به شما این امکان را میدهد تا برنامههایی بنویسید که بیشتر شبیه دنیای واقعی هستند. با استفاده از اشیاء، میتوانید مدلهای دقیقتری از سیستمهایی که میخواهید شبیهسازی کنید، بسازید.
اجزای اصلی شی در جاوا
حال که با اهمیت شی گرایی آشنا شدیم، بیایید ببینیم یک شیء در جاوا از چه اجزایی تشکیل شده است:
- صفت (Attribute): همان ویژگیهای یک شیء هستند. در مثال ماشین، رنگ، سرعت و مدل، صفات آن هستند.
- رفتار (Method): کارهایی هستند که یک شیء میتواند انجام دهد. در مثال ماشین، حرکت کردن، ترمز کردن و بوق زدن، رفتارهای آن هستند.
- سازنده (Constructor): یک متد خاص است که در زمان ایجاد یک شیء فراخوانی میشود و مقادیر اولیه را به صفات آن اختصاص میدهد.
- دسترسپذیری (Access Modifiers): کلمات کلیدیای هستند که مشخص میکنند چه قسمتهایی از یک شیء از بخشهای دیگر برنامه قابل دسترسی باشند.
کلاسها در جاوا: الگوی ساخت اشیاء
تا به اینجا با مفهوم شیء آشنا شدیم. اما چگونه میتوانیم اشیاء را در برنامه خود بسازیم؟ اینجاست که کلاسها (Class) به کمک ما میآیند. یک کلاس، درواقع یک الگو یا قالب است که مشخص میکند یک شیء چه ویژگیهایی دارد و چه کارهایی میتواند انجام دهد. به عبارت دیگر، کلاس نقشه ساخت اشیاء و مبنای شی گرایی در جاوا است.
برای مثال، میتوانیم یک کلاس به نام «ماشین» تعریف کنیم که ویژگیهایی مانند رنگ، سرعت و مدل را داشته باشد و همچنین متدهایی برای حرکت کردن، ترمز کردن و بوق زدن داشته باشد. سپس با استفاده از این کلاس، میتوانیم چندین شیء ماشین با رنگها و مدلهای مختلف بسازیم.
وارثت در شی گرایی جاوا
یکی از قدرتمندترین مفاهیم در برنامهنویسی شیءگرا، وراثت (Inheritance) است. وراثت به شما این امکان را میدهد تا از یک کلاس موجود برای ساخت کلاسهای جدید با ویژگیها و رفتارهای مشابه استفاده کنید. کلاس جدید (کلاس مشتقشده) از کلاس موجود (کلاس پایه) ارث میبرد. کلاس مشتقشده میتواند متدها و متغیرهای کلاس پایه را به ارث ببرد و همچنین میتواند متدها و متغیرهای خاص خود را اضافه کند.
فرض کنید میخواهید دو کلاس جدید به نام «کامیون» و «اتوبوس» بسازید که هر دو از کلاس «ماشین» ارث میبرند. هر دوی این کلاسها میتوانند از ویژگیها و رفتارهای کلاس «ماشین» مانند رنگ، سرعت و مدل استفاده کنند. اما در عین حال، میتوانند ویژگیها و رفتارهای خاص خود را نیز داشته باشند. مثلا، کلاس «کامیون» میتواند ظرفیت بار و کلاس «اتوبوس» میتواند تعداد صندلی را داشته باشد.
مزایای وراثت:
- استفاده مجدد از کد: با استفاده از وراثت ، نیازی به نوشتن دوباره کد برای ویژگیها و رفتارهای مشترک کلاسها نیست. این موضوع باعث میشود کد شما خواناتر، قابل فهمتر و کارآمدتر شود.
- ایجاد سلسله مراتب: با استفاده از وراثت ، میتوانید سلسله مراتبی از کلاسها ایجاد کنید که در آن کلاسهای بالاتر، ویژگیها و رفتارهای کلیتر را تعریف میکنند و کلاسهای پایینتر، جزئیات بیشتری را اضافه میکنند.
- تخصصیسازی: وراثت به شما این امکان را میدهد تا کلاسهای پایه را به کلاسهای تخصصیتر با ویژگیها و رفتارهای خاص تبدیل کنید.
رابطها در جاوا: تعریف رفتارهای مشترک
در کنار وراثت در شێ گرایی در جاوا، رابطها (Interface) نیز ابزاری قدرتمند برای سازماندهی برنامههای شیءگرا هستند. رابطها مجموعهای از متدها را تعریف میکنند که یک کلاس باید آنها را پیادهسازی کند. با استفاده از رابطها، میتوانید نوعی قرارداد بین کلاسها ایجاد کنید و مطمئن شوید که همه آنها از متدهای مشخصی پشتیبانی میکنند.
فرض کنید میخواهید یک رابط به نام «قابل رانندگی» (Drivable) تعریف کنید که متدی به نام driveدارد. این متد نحوه رانندگی یک وسیله نقلیه را مشخص میکند. سپس میتوانید کلاسهای «ماشین»، «کامیون» و «اتوبوس» را طوری پیادهسازی کنید که رابط «قابل رانندگی» را پیادهسازی کنند.
مزایای رابطها:
- انعطافپذیری: رابطها به شما این امکان را میدهند تا کلاسها را از منابع مختلف ترکیب کنید، حتی اگر از سلسله مراتب توارث یکسانی پیروی نکنند.
- قابلیت چندگانه ارثی: برخلاف توارث، که در آن یک کلاس فقط میتواند از یک کلاس دیگر ارث ببرد، رابطها به شما این امکان را میدهند تا از چندین رابط به طور همزمان ارث ببرید.
- طراحی مبتنی بر قرارداد: رابطها به شما این امکان را میدهند تا نوعی قرارداد بین کلاسها ایجاد کنید و مطمئن شوید که همه آنها از متدهای مشخصی پشتیبانی میکنند.
آموزش شی گرایی در جاوا با یک مثال عملی
فرض کنید میخواهیم یک برنامه ساده برای محاسبه مساحت و محیط مستطیل بنویسیم. در این مثال، مفاهیم پایه شی گرایی در جاوا را به صورت عملی پیادهسازی میکنیم.
1. تعریف کلاس:
ابتدا یک کلاس به نام مستطیل (Rectangle) تعریف میکنیم. این کلاس شامل ویژگیها و رفتارهای مربوط به یک مستطیل خواهد بود.
class مستطیل {
// صفات (ویژگی ها)
private double طول;
private double عرض;
// سازنده (Constructor)
public مستطیل(double طول, double عرض) {
this.طول = طول;
this.عرض = عرض;
}
// رفتار (متد) برای محاسبه مساحت
public double محاسبه_مساحت() {
return طول * عرض;
}
// رفتار (متد) برای محاسبه محیط
public double محاسبه_محیط() {
return 2 * (طول + عرض);
}
}
2. ایجاد اشیاء:
در ادامه، میتوانیم اشیاء مختلفی از نوع مستطیل با طول و عرضهای مختلف ایجاد کنیم.
// ایجاد دو شیء مستطیل
مستطیل مستطیل1 = new مستطیل(5, 3);
مستطیل مستطیل2 = new مستطیل(10, 7);
3. استفاده از رفتارها:
حالا میتوانیم از متدهای محاسبه_مساحت و محاسبه_محیط برای محاسبه مساحت و محیط هر مستطیل استفاده کنیم.
// محاسبه مساحت و محیط مستطیل1
double مساحت_مستطیل1 = مستطیل1.محاسبه_مساحت();
double محیط_مستطیل1 = مستطیل1.محاسبه_محیط();
System.out.println("مساحت مستطیل 1: " + مساحت_مستطیل1);
System.out.println("محیط مستطیل 1: " + محیط_مستطیل1);
// محاسبه مساحت و محیط مستطیل2
double مساحت_مستطیل2 = مستطیل2.محاسبه_مساحت();
ouble محیط_مستطیل2 = مستطیل2.محاسبه_محیط();
System.out.println("مساحت مستطیل 2: " + مساحت_مستطیل2);
System.out.println("محیط مستطیل 2: " + محیط_مستطیل2);
خروجی برنامه:
توضیح:
در این مثال، ما با مفاهیم پایه شی گرایی در جاوا مانند کلاس، شیء، صفت، سازنده، متد و نحوه استفاده از آنها آشنا شدیم.
- کلاس: نقشه ساخت اشیاء است و شامل صفات و رفتارهای مربوط به آن شیء است.
- شیء: نمونهای از یک کلاس است که دارای مقادیر خاص برای صفات آن کلاس است.
- صفات: ویژگیهای یک شیء را نشان میدهند و مقادیر آنها توسط برنامهنویس تعیین میشود.
- سازنده: متدی است که در زمان ایجاد یک شیء فراخوانی میشود و مقادیر اولیه را به صفات آن شیء اختصاص میدهد.
- متد: رفتار یک شیء را نشان میدهد و وظایف خاصی را انجام میدهد.
با استفاده از این مفاهیم، میتوانیم برنامههای شیءگرا را به صورت سازمانیافتهتر، خواناتر و قابل نگهداریتر طراحی و پیادهسازی کنیم.
نکات:
- در این مثال، از دو متد محاسبه_مساحت و محاسبه_محیط برای محاسبه مساحت و محیط مستطیل استفاده کردیم. شما میتوانید متدهای دیگری را نیز به کلاس مستطیل اضافه کنید.
- برای دسترسی به صفات خصوصی یک کلاس، باید از متدهای getter و setter استفاده کنید.
- میتوانید از مفاهیم توارث و رابط برای ایجاد روابط بین کلاسها و پیادهسازی رفتارهای مشترک استفاده کنید.
مثالی دیگر از شی گرایی در جاوا
در این مثال، میخواهیم یک برنامه ساده برای مدیریت یک فروشگاه کتاب با استفاده از مفاهیم شی گرایی در جاوا بسازیم. این مثال مفاهیم پیچیدهتر مانند توارث، رابط و پلیمورفیسم را نیز به شما معرفی میکند.
1. مدلسازی:
فرض کنید که فروشگاه ما کتابهایی با ژانرهای مختلف (مانند داستان، علمی، آموزشی و …) را به فروش میرساند. هر کتاب دارای ویژگیهایی مانند عنوان، نویسنده، قیمت، تعداد موجودی و ژانر است.
2. تعریف کلاسها:
- کلاس کتاب: این کلاس شامل صفات و رفتارهای مشترک همه کتابها خواهد بود.
class کتاب {
// صفات
private String عنوان;
private String نویسنده;
private double قیمت;
private int موجودی;
private String ژانر;
// سازنده
public کتاب(String عنوان, String نویسنده, double قیمت, int موجودی, String ژانر) {
this.عنوان = عنوان;
this.نویسنده = نویسنده;
this.قیمت = قیمت;
this.موجودی = موجودی;
this.ژانر = ژانر;
}
// رفتارها
// ... (متدهای get و set برای صفات، متدهایی برای فروش و ...)
}
- کلاسهای مشتقشده: میتوانیم کلاسهای مشتقشدهای از کلاس کتاب برای ژانرهای مختلف، مانند کتاب_داستان، کتاب_علمی و کتاب_آموزشی ایجاد کنیم. هر کلاس مشتقشده میتواند صفات و رفتارهای خاص خود را نیز داشته باشد.
class کتاب_داستان extends کتاب {
// صفات و رفتارهای خاص کتاب داستان
}
class کتاب_علمی extends کتاب {
// صفات و رفتارهای خاص کتاب علمی
}
class کتاب_آموزشی extends کتاب {
// صفات و رفتارهای خاص کتاب آموزشی
}
3. رابطها:
- رابط قابل_فروش: این رابط متدی به نام فروش را تعریف میکند که هر کتابی که آن را پیادهسازی میکند باید آن را داشته باشد.
interface قابل_فروش {
void فروش();
}
- پیادهسازی رابط: کلاسهای کتاب، کتاب_داستان، کتاب_علمی و کتاب_آموزشی باید رابط قابل_فروش را پیادهسازی کنند و متد فروش را برای هر کتاب به صورت جداگانه پیادهسازی کنند.
// پیاده سازی رابط در کلاس کتاب
public class کتاب implements قابل_فروش {
// ...
@Override
public void فروش() {
// ... (عملیات مربوط به فروش کتاب)
}
}
4. پلیمورفیسم:
- با استفاده از پلیمورفیسم، میتوانیم متد فروش را برای هر کتاب به صورت جداگانه پیادهسازی کنیم و از آن برای فروش کتابهای مختلف با رفتارهای متمایز استفاده کنیم.
// مثال استفاده از پلیمورفیسم
کتاب کتاب1 = new کتاب_داستان("دن کیشوت", "سِرْوآنتِس", 45000, 10, "داستان");
کتاب کتاب2 = new کتاب_علمی("جهان هستی در پوست گردو", "استیون هاوکینگ", 98000, 5, "علمی");
کتاب1.فروش(); // اجرای متد فروش مربوط به کتاب داستان
کتاب2.فروش(); // اجرای متد فروش مربوط به کتاب علمی
5. مثال کامل:
// ... (تعریف کلاس ها و رابط ها)
public class Main {
public static void main(String[] args) {
// ایجاد کتاب ها
کتاب کتاب1 = new کتاب_داستان("دن کیشوت", "سِرْوآنتِس", 45000, 10, "داستان");
کتاب کتاب2 = new کتاب_علمی("جهان هستی در پوست گردو", "استیون هاوکینگ", 98000, 5, "علمی");
// فروش کتاب ها
کتاب1.فروش();
کتاب2.فروش();
// ... (عملیات دیگر فروشگاه)
}
یادگیری برنامه نویسی شی گرا با جاوا چه فایدهای دارد؟
برنامهنویسی شی گرا با جاوا به شما این امکان را میدهد تا برنامههای سازمانیافتهتر، کارآمدتر و قابل نگهداریتر بسازید. با یادگیری و تسلط بر مفاهیم برنامهنویسی شیءگرا در جاوا، میتوانید به یک برنامهنویس ماهر تبدیل شوید و در دنیای هیجانانگیز توسعه نرمافزار، حرفی برای گفتن داشته باشید.
علاوه بر این، جاوا به دلیل پلتفرم مستقل، قابلیت اطمینان و تنوع، در طیف وسیعی از برنامهها و بازیها مورد استفاده قرار میگیرد. از جمله این برنامهها میتوان به سیستم عامل اندروید، برنامههای وب، برنامههای سازمانی، سیستمهای تعبیه شده، برنامههای علمی و محاسباتی، بازیهای ویدیویی، برنامههای کاربردی موبایل و اینترنت اشیا اشاره کرد.
بنابراین، یادگیری برنامهنویسی شیءگرا با جاوا نه تنها برای تبدیل شدن به یک برنامهنویس ماهر مفید است، بلکه به شما امکان میدهد تا در طیف وسیعی از پروژههای مختلف کار کنید.
جمعبندی: قدرت برنامه نویسی شی گرا در Java
برنامهنویسی شیءگرا با مفاهیمی مانند کلاس، شیء، توارث و رابط، به شما این امکان را میدهد تا برنامههای سازمانیافتهتر، کارآمدتر و قابل نگهداریتر بسازید. جاوا با ارائه امکانات قدرتمندی برای پیادهسازی این مفاهیم، به یکی از محبوبترین زبانها برای برنامهنویسی شیءگرا تبدیل شده است.
در این نوشته از مجله مکتوب، به بررسی مفاهیم پایه شی گرایی در جاوا با استفاده از مثالهای عملی پرداختیم. شیءگرایی پارادایمی قدرتمند در برنامهنویسی است که به شما امکان میدهد تا برنامههای سازمانیافتهتر، کارآمدتر و قابل نگهداریتر بسازید. اگر به فکر یادگیری کامل زبان جاوا با همه ابعاد آن هستید، پیشنهاد ما به شما استفاده از دوره های آموزش جاوا در مکتب خونه است. همچنین انواع آموزش برنامه نویسی به عنوان مکمل و پیشنیاز زبان جاوا در مکتب خونه موجود است.