OOP in Java Second section | شی گرایی در جاوا قسمت دوم
📖توضیحات درس
📄جزوه
مفاهیم کلیدی
- Inheritance (ارثبری)
مکانیزمی که اجازه میدهد یک کلاس (Subclass) ویژگیها و متدهای کلاس دیگری (Superclass) را به ارث ببرد. این کار از تکرار کدهای مشترک جلوگیری میکند. - Package (پکیج)
ساختاری شبیه به پوشهبندی در سیستمعامل که برای دستهبندی کلاسهای مرتبط، جلوگیری از تداخل نامها و مدیریت بهتر پروژه استفاده میشود. - Access Modifiers (اصلاحگرهای دسترسی)
کلماتی کلیدی که سطح دسترسی به کلاسها، متدها و متغیرها را تعیین میکنند (شاملpublic،private،protectedو حالتdefault). - Method Overriding (بازنویسی متد)
زمانی که یک کلاس فرزند، پیادهسازی متدی که از پدر به ارث برده است را تغییر میدهد تا رفتار خاص خود را داشته باشد. superKeyword
کلمهای کلیدی که برای ارجاع به اعضای کلاس پدر (مانند سازنده یا متدها) از داخل کلاس فرزند استفاده میشود.finalKeyword
این کلمه کلیدی بسته به مکان استفاده، معنای "تغییرناپذیر" میدهد؛ برای متغیر (ثابت کردن مقدار)، برای متد (جلوگیری از اورراید) و برای کلاس (جلوگیری از ارثبری).staticKeyword
به معنای تعلق یک عضو به خودِ کلاس است، نه به نمونههای ساخته شده از آن. اعضای استاتیک بدون نیاز به ساخت شیء قابل دسترسی هستند.
نکات مهم مصاحبهای
-
آزمون
Is-aدر ارثبری چیست؟
برای بررسی درستی رابطه ارثبری از این آزمون استفاده میشود. اگر بتوان گفت "دانشجو یک فرد است" (Student is a Person)، رابطه صحیح است؛ اما "میز یک دانشجو است" غلط است و نباید ارثبری صورت گیرد. -
تفاوت سطوح دسترسی در جاوا چیست؟
public: دسترسی از همه جا.private: فقط داخل همان کلاس.protected: داخل همان پکیج و کلاسهای فرزند (حتی در پکیجهای دیگر).default(بدون مودفایر): فقط داخل همان پکیج.
-
قوانین اصلی Method Overriding چیست؟
نام متد و پارامترها باید دقیقاً مشابه پدر باشد. سطح دسترسی در فرزند نمیتواند محدودتر از پدر باشد (مثلاً نمیتوان متدpublicپدر را در فرزندprivateکرد). -
تفاوت
thisوsuperچیست؟
thisبه اعضای همان کلاس فعلی اشاره دارد، در حالی کهsuperبه اعضای کلاس پدر اشاره میکند. -
کاربرد
finalدر کلاس و متد چیست؟
وقتی کلاسیfinalشود، هیچ کلاس دیگری نمیتواند از آن ارثبری کند (مانند کلاسScanner). وقتی متدیfinalشود، فرزندان نمیتوانند آن را اورراید کنند. -
چرا از متغیر
staticاستفاده میکنیم؟
زمانی که بخواهیم یک مقدار بین تمامی اشیاء ساخته شده از یک کلاس مشترک باشد یا بخواهیم متدی کمکی (Utility) بنویسیم که نیازی به ایجاد شیء نداشته باشد.
مثال یا سناریوی کاربردی
سناریو: مدیریت اعضای دانشگاه
۱. ایجاد کلاس والد: یک کلاس به نام Person تعریف میکنیم که ویژگیهای مشترک مانند firstName ،lastName و age را دارد.
۲. استفاده از Inheritance: کلاسهای Student و Professor را ایجاد کرده و آنها را از Person اکستند (extends) میکنیم. حالا این دو کلاس خودبهخود ویژگیهای نام و سن را دارند.
۳. استفاده از super: در سازنده (Constructor) کلاس Student ، با استفاده از super(firstName, lastName, ...) مقادیر را به سازنده کلاس پدر میفرستیم تا مقداردهی اولیه انجام شود.
۴. اجرای Overriding: متد printInfo() در کلاس پدر یک متن عمومی چاپ میکند. در کلاس Student این متد را اورراید میکنیم تا علاوه بر مشخصات فردی، "شماره دانشجویی" را هم چاپ کند.
// نمونه کد ساده
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: همیشه از این انوتیشن استفاده کنید؛ چون اگر نام متد را اشتباه بنویسید، کامپایلر به شما خطا میدهد و از بروز باگهای منطقی جلوگیری میکند. -
نکته در مورد
import: وقتی از کلاسهایی در پکیجهای دیگر استفاده میکنید، IDE به طور خودکار دستورimportرا اضافه میکند. کلاسهای موجود در یک پکیج نیازی به ایمپورت یکدیگر ندارند. -
نکته طراحی: اگر قصد دارید کلاسی بسازید که فقط متدهای محاسباتی و کمکی دارد، متدها را
staticتعریف کنید تا کاربر مجبور به ساخت شیء اضافی در حافظه نشود.
