Farzad Afi Logo

FarzadAfi

آموزش تخصصی برنامه نویسی

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

📖توضیحات درس

🎥 این ویدیو قسمت نوزدهم از بوت‌کمپ رایگان جاواست. 🧩 آموزش شی‌گرایی در جاوا – قسمت سوم 📝 در این قسمت، مسیر یادگیری شی‌گرایی را با مفاهیم بسیار مهم‌تری ادامه می‌دهیم؛ مفاهیمی که پایه‌گذار طراحی حرفه‌ای نرم‌افزار هستند. 🔒 از کپسوله‌سازی (Encapsulation) شروع می‌کنیم و تفاوت نوع‌های داده‌ی primitive و reference رو بررسی می‌کنیم. 🔧 سپس با کلاس‌های کمکی مثل Wrapper Class آشنا می‌شیم و وارد مباحث تبدیل نوع (Casting)، عملگر instanceof، و در نهایت یکی از مهم‌ترین ویژگی‌های OOP یعنی چندریختی (Polymorphism) می‌شیم. ✅ در ادامه با حل تمرین‌های واقعی، این مفاهیم رو کاملاً در عمل یاد می‌گیریم. این تمرین‌ها به‌گونه‌ای طراحی شدن که دید عمیق‌تری به طراحی و ساختار شی‌گرا بهت بدن. 💻 سورس‌کد این جلسه در گیت‌هاب: 🔗 github.com/farzadafi/ProgrammingByFarzadAfi/tree/master/src/k_oop 👥 گروه پرسش و پاسخ تلگرام: @programmingByFarzadAfi 💬 گروه پرسش و پاسخ بله: @programming_by_farzadafi ❓ هر سوالی داشتی، می‌تونی توی گروه بپرسی؛ من یا مربی‌های گروه راهنماییت می‌کنیم 🎓 بوت‌کمپ رایگان جاوا – آموزش تمرین‌محور برای یادگیری عمیق و ورود به بازار کار.
01:59:02🎯رایگان

📄جزوه

مفاهیم کلیدی

  • Encapsulation (کپسوله‌سازی)
    پنهان‌سازی داده‌های حساس کلاس از دسترسی مستقیم بیرونی. این کار با private کردن فیلدها و فراهم کردن متدهای پابلیک Getter و Setter برای مدیریت و اعتبارسنجی داده‌ها انجام می‌شود.

  • Primitive Types
    نوع‌های داده‌ای پایه در جاوا (مانند int, double, boolean) که مقادیر را مستقیماً در حافظه Stack ذخیره می‌کنند و سرعت بالایی دارند.

  • Reference Types
    شامل کلاس‌ها، اینترفیس‌ها و آرایه‌ها که به جای مقدار، آدرس شیء در حافظه Heap را ذخیره می‌کنند. تمام این نوع‌ها از کلاس Object ارث‌بری می‌کنند.

  • Wrapper Class
    کلاس‌هایی که نوع‌های Primitive را درون یک Object کپسوله می‌کنند (مانند Integer برای int). این کلاس‌ها برای استفاده در Genericها و Collectionها ضروری هستند.

  • Autoboxing & Unboxing
    تبدیل خودکار نوع‌های Primitive به Wrapper متناظر آن‌ها (Autoboxing) و برعکس (Unboxing) که از نسخه ۵ جاوا اضافه شده است.

  • Type Casting
    تبدیل یک نوع داده به نوع دیگر. در Primitiveها به دو صورت Widening (خودکار) و Narrowing (دستی) و در Objectها به صورت Upcasting و Downcasting انجام می‌شود.

  • Upcasting
    تبدیل یک شیء از کلاس فرزند به کلاس پدر. این کار به صورت خودکار (Implicit) انجام می‌شود و باعث محدود شدن دسترسی به متدهای اختصاصی فرزند می‌گردد.

  • Downcasting
    تبدیل ارجاع کلاس پدر به کلاس فرزند. این کار باید به صورت صریح (Explicit) انجام شود و خطر بروز خطا در زمان اجرا را دارد.

  • instanceof
    عملگری برای بررسی اینکه آیا یک شیء در زمان اجرا (Runtime) نمونه‌ای از یک کلاس خاص هست یا خیر؛ کاربرد اصلی آن جلوگیری از خطای ClassCastException است.

  • Polymorphism (چندریختی)
    توانایی انجام یک کار به روش‌های مختلف. شامل دو نوع Static (در زمان کامپایل از طریق Overloading) و Dynamic (در زمان اجرا از طریق Overriding) است.

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

  • تفاوت اصلی Primitive Types و Reference Types چیست؟
    نوع‌های Primitive مقدار را در Stack ذخیره می‌کنند، مقدار پیش‌فرض دارند و null نمی‌پذیرند. Reference Typeها آدرس را ذخیره می‌کنند، در Heap ساخته می‌شوند و می‌توانند null باشند.

  • چرا به Wrapper Classها نیاز داریم؟
    ساختارهای داده‌ای جاوا مانند ArrayList یا مفاهیم Generic فقط با Objectها کار می‌کنند و نمی‌توانند نوع‌های Primitive را مستقیماً بپذیرند.

  • تفاوت Static Polymorphism و Dynamic Polymorphism چیست؟
    نوع Static از طریق Method Overloading (متدهای همنام با ورودی متفاوت) در زمان کامپایل مشخص می‌شود. نوع Dynamic از طریق Method Overriding و ارث‌بری در زمان اجرا توسط JVM مدیریت می‌شود.

  • چگونه از خطای ClassCastException جلوگیری کنیم؟
    قبل از انجام Downcasting، باید با استفاده از عملگر instanceof بررسی کنیم که آیا شیء مورد نظر واقعاً از نوع کلاس مقصد هست یا خیر.

  • مزیت اصلی Encapsulation چیست؟
    ایجاد یک گلوگاه (Validation) برای ورود داده‌ها. مثلاً می‌توان در متد Setter چک کرد که سن وارد شده منفی نباشد.

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

سناریوی Encapsulation: فرض کنید کلاسی به نام Student دارید. اگر فیلد age به صورت پابلیک باشد، ممکن است عددی منفی (مانند ۱۰-) به آن داده شود. با کپسوله‌سازی، فیلد را private کرده و در متد setAge شرط می‌گذاریم:

public void setAge(int age) {
    if (age > 0 && age < 100) {
        this.age = age;
    } else {
        this.age = 0; // مقدار پیش‌فرض در صورت ورودی نامعتبر
    }
}

سناریوی Polymorphism و Casting: اگر یک کلاس پدر Animal و فرزندان Dog و Cat داشته باشیم که متد makeSound را Override کرده‌اند:

Animal myDog = new Dog(); // Upcasting (خودکار)
myDog.makeSound(); // خروجی: صدای سگ (Dynamic Polymorphism)

if (myDog instanceof Dog) {
    Dog realDog = (Dog) myDog; // Downcasting (صریح)
    realDog.wagTail(); // دسترسی به متد اختصاصی سگ
}

بیشتر بدانید

  • نکته در مورد حروف بزرگ و کوچک: در جاوا، تمام نوع‌های Primitive با حروف کوچک شروع می‌شوند (int) و تمام Reference Typeها یا کلاس‌ها طبق قرارداد با حروف بزرگ شروع می‌شوند (String, Integer).
  • پسوند اعداد: برای تعریف مقادیر اعشاری دقیق، از پسوند f برای float و d برای double استفاده کنید (مثلاً 10.5f).
  • حذف متدها در Upcasting: توجه داشته باشید که وقتی یک شیء را Upcast می‌کنید، متدهای اختصاصی کلاس فرزند از دسترس خارج می‌شوند و فقط متدهای مشترک با کلاس پدر قابل فراخوانی هستند.