OOP in Java Second section | شی گرایی در جاوا قسمت دوم
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
- Inheritance (ارثبری)
Inheritance مکانیزمی است که اجازه میدهد یک کلاس فرزند (Subclass) ویژگیها و متدهای کلاس والد (Superclass) را به ارث ببرد. این کار از تکرار کدهای مشترک جلوگیری میکند.
- Package (پکیج)
Package ساختاری مشابه پوشهبندی در سیستمعامل است که برای دستهبندی کلاسهای مرتبط، جلوگیری از تداخل نامها و مدیریت بهتر پروژه استفاده میشود.
- Access Modifiers (اصلاحگرهای دسترسی)
Access Modifiers کلمات کلیدی هستند که سطح دسترسی کلاسها، متدها و متغیرها را تعیین میکنند. این اصلاحگرها شامل public، private، protected و حالت default هستند.
- Method Overriding (بازنویسی متد)
Method Overriding زمانی رخ میدهد که یک کلاس فرزند، پیادهسازی متدی را که از کلاس والد به ارث برده است تغییر دهد تا رفتار اختصاصی خود را داشته باشد.
superKeyword
کلمه کلیدی super برای ارجاع به اعضای کلاس والد، مانند سازنده (Constructor) یا متدها، از داخل کلاس فرزند استفاده میشود.
finalKeyword
کلمه کلیدی final با توجه به محل استفاده، مفهوم تغییرناپذیری دارد. برای متغیر، مقدار را ثابت میکند؛ برای متد، از Override شدن جلوگیری میکند؛ و برای کلاس، مانع ارثبری میشود.
staticKeyword
کلمه کلیدی 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 تعریف کنید تا کاربر برای استفاده از آنها مجبور به ساخت شیء اضافی در حافظه نباشد.
