جلسه شماره 18رایگان

OOP in Java Second section | شی گرایی در جاوا قسمت دوم

01:35:49

توضیحات جلسه

🎥 این ویدیو قسمت هجدهم از بوت‌کمپ رایگان جاواست. 🧩 آموزش شی‌گرایی در جاوا – قسمت دوم 📝 در این قسمت به ادامه‌ی مسیر یادگیری شی‌گرایی در جاوا می‌پردازیم. مفاهیم پیشرفته‌تری مثل ارث‌بری (Inheritance)، پکیج‌ها (Packages)، و سطوح دسترسی (Access Modifiers) رو بررسی می‌کنیم. 🔑 همچنین با کلمات کلیدی مهمی مثل super، final و static آشنا می‌شیم و یاد می‌گیریم چطور رفتار کلاس‌ها و متدها رو با override تغییر بدیم. ✅ در پایان جلسه، با حل دو تمرین واقعی، آموخته‌هامون رو به‌صورت عملی پیاده‌سازی می‌کنیم تا مباحث به‌خوبی در ذهن تثبیت بشن. 🚀 اگر قسمت قبلی مقدمه‌ای برای شی‌گرایی بود، این قسمت گام بلندی به‌سمت تسلط بیشتر روی اصول طراحی شی‌گراست. 👥 گروه پرسش و پاسخ تلگرام: @programmingByFarzadAfi 💬 گروه پرسش و پاسخ بله: @programming_by_farzadafi ❓ هر سوالی داشتی، می‌تونی توی گروه بپرسی؛ من یا مربی‌های گروه راهنماییت می‌کنیم 🎓 بوت‌کمپ رایگان جاوا – آموزش تمرین‌محور برای یادگیری عمیق و ورود به بازار کار.

جزوه و مستندات

مفاهیم کلیدی

  • Inheritance (ارث‌بری)

Inheritance مکانیزمی است که اجازه می‌دهد یک کلاس فرزند (Subclass) ویژگی‌ها و متدهای کلاس والد (Superclass) را به ارث ببرد. این کار از تکرار کدهای مشترک جلوگیری می‌کند.

  • Package (پکیج)

Package ساختاری مشابه پوشه‌بندی در سیستم‌عامل است که برای دسته‌بندی کلاس‌های مرتبط، جلوگیری از تداخل نام‌ها و مدیریت بهتر پروژه استفاده می‌شود.

  • Access Modifiers (اصلاح‌گرهای دسترسی)

Access Modifiers کلمات کلیدی هستند که سطح دسترسی کلاس‌ها، متدها و متغیرها را تعیین می‌کنند. این اصلاح‌گرها شامل public، private، protected و حالت default هستند.

  • Method Overriding (بازنویسی متد)

Method Overriding زمانی رخ می‌دهد که یک کلاس فرزند، پیاده‌سازی متدی را که از کلاس والد به ارث برده است تغییر دهد تا رفتار اختصاصی خود را داشته باشد.

  • super Keyword

کلمه کلیدی super برای ارجاع به اعضای کلاس والد، مانند سازنده (Constructor) یا متدها، از داخل کلاس فرزند استفاده می‌شود.

  • final Keyword

کلمه کلیدی final با توجه به محل استفاده، مفهوم تغییرناپذیری دارد. برای متغیر، مقدار را ثابت می‌کند؛ برای متد، از Override شدن جلوگیری می‌کند؛ و برای کلاس، مانع ارث‌بری می‌شود.

  • static Keyword

کلمه کلیدی static نشان می‌دهد که یک عضو به خود کلاس تعلق دارد، نه به نمونه‌های ساخته‌شده از آن. اعضای static بدون نیاز به ساخت شیء قابل دسترسی هستند.

نکات مهم مصاحبه‌ای

  • آزمون Is-a در ارث‌بری چیست؟

برای بررسی درستی رابطه ارث‌بری، از آزمون Is-a استفاده می‌شود.

اگر بتوان گفت «دانشجو یک فرد است»، یعنی Student is a Person، رابطه ارث‌بری صحیح است. اما عبارت «میز یک دانشجو است» نادرست است؛ بنابراین نباید بین این دو مفهوم رابطه ارث‌بری ایجاد شود.

  • تفاوت سطوح دسترسی در جاوا چیست؟

  • public: دسترسی از همه‌جا امکان‌پذیر است.

  • private: دسترسی فقط از داخل همان کلاس امکان‌پذیر است.

  • protected: دسترسی از داخل همان Package و همچنین کلاس‌های فرزند، حتی در Packageهای دیگر، امکان‌پذیر است.

  • default: در صورت ننوشتن هیچ اصلاح‌گری، دسترسی فقط از داخل همان Package امکان‌پذیر است.

  • قوانین اصلی Method Overriding چیست؟

نام متد و پارامترهای آن باید دقیقاً با متد کلاس والد یکسان باشند.

همچنین، سطح دسترسی متد در کلاس فرزند نمی‌تواند محدودتر از متد کلاس والد باشد. برای مثال، نمی‌توان یک متد public در کلاس والد را به متد private در کلاس فرزند تبدیل کرد.

  • تفاوت this و super چیست؟

کلمه کلیدی this به اعضای همان کلاس فعلی اشاره می‌کند؛ در حالی که super به اعضای کلاس والد اشاره دارد.

  • کاربرد final در کلاس و متد چیست؟

اگر یک کلاس با final تعریف شود، هیچ کلاس دیگری نمی‌تواند از آن ارث‌بری کند؛ برای مثال، کلاس Scanner.

اگر یک متد با final تعریف شود، کلاس‌های فرزند نمی‌توانند آن متد را Override کنند.

  • چرا از متغیر static استفاده می‌کنیم؟

از متغیر static زمانی استفاده می‌کنیم که بخواهیم یک مقدار میان تمام اشیای ساخته‌شده از یک کلاس مشترک باشد.

همچنین می‌توان از متدهای static برای ایجاد متدهای کمکی (Utility) استفاده کرد؛ متدهایی که برای اجرا به ساخت شیء نیاز ندارند.

مثال یا سناریوی کاربردی

سناریو: مدیریت اعضای دانشگاه

۱. ایجاد کلاس والد:

کلاسی با نام Person تعریف می‌کنیم که ویژگی‌های مشترکی مانند firstName، lastName و age دارد.

۲. استفاده از Inheritance:

کلاس‌های Student و Professor را ایجاد می‌کنیم و آن‌ها را از کلاس Person با کلمه کلیدی extends به ارث می‌بریم. اکنون هر دو کلاس، ویژگی‌های نام و سن را به‌صورت خودکار در اختیار دارند.

۳. استفاده از super:

در سازنده (Constructor) کلاس Student، با استفاده از super(firstName, lastName, ...) مقادیر را به سازنده کلاس والد ارسال می‌کنیم تا مقداردهی اولیه انجام شود.

۴. اجرای Method Overriding:

متد printInfo() در کلاس والد اطلاعاتی عمومی را چاپ می‌کند. در کلاس Student، این متد را Override می‌کنیم تا علاوه بر مشخصات فردی، شماره دانشجویی نیز نمایش داده شود.

// نمونه کد ساده
public class Person {
    protected String name;

    public void sayHello() {
        System.out.println("Hello from Person");
    }
}

public class Student extends Person {
    @Override
    public void sayHello() {
        System.out.println("Hello from Student");
    }
}

بیشتر بدانید

  • تذکر در IntelliJ

اگر متدی را Override کنید، یک علامت فلش کوچک در کنار شماره خط ظاهر می‌شود. با کلیک روی آن می‌توانید به متد متناظر در کلاس والد بروید.

  • استفاده از @Override

همیشه از انوتیشن @Override استفاده کنید. اگر نام متد را اشتباه بنویسید یا امضای متد با متد کلاس والد مطابقت نداشته باشد، کامپایلر خطا نمایش می‌دهد و از بروز باگ‌های منطقی جلوگیری می‌کند.

  • نکته در مورد import

هنگام استفاده از کلاس‌های موجود در Packageهای دیگر، محیط توسعه (IDE) معمولاً دستور import را به‌صورت خودکار اضافه می‌کند.

کلاس‌های موجود در یک Package نیازی به import کردن یکدیگر ندارند.

  • نکته طراحی

اگر قصد دارید کلاسی ایجاد کنید که فقط شامل متدهای محاسباتی و کمکی است، متدهای آن را static تعریف کنید تا کاربر برای استفاده از آن‌ها مجبور به ساخت شیء اضافی در حافظه نباشد.