OOP in Java Third Section | شی گرایی در جاوا قسمت سوم
📖توضیحات درس
📄جزوه
مفاهیم کلیدی
-
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 میکنید، متدهای اختصاصی کلاس فرزند از دسترس خارج میشوند و فقط متدهای مشترک با کلاس پدر قابل فراخوانی هستند.
