OOP in Java Fourth Section | شی گرایی در جاوا قسمت چهارم
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
Abstraction
انتزاع (Abstraction) فرایندی است که در آن جزئیات پیادهسازی از کاربر پنهان میشوند و فقط عملکردهای اصلی نمایش داده میشوند.
بهعبارت دیگر، تمرکز بر این است که یک بخش از برنامه «چه کاری» انجام میدهد، نه اینکه آن کار را «چگونه» انجام میدهد.
Abstract Class
کلاس انتزاعی (Abstract Class) با کلمه کلیدی abstract تعریف میشود و نمیتوان مستقیماً از آن شیء (Object) ساخت.
این کلاس میتواند شامل متدهای انتزاعی، یعنی متدهای بدون بدنه، و متدهای معمولی، یعنی متدهای دارای بدنه، باشد.
Interface
اینترفیس (Interface) ساختاری کاملاً انتزاعی است که مجموعهای از رفتارها را بهصورت یک قرارداد تعریف میکند.
کلاسهایی که یک Interface را با کلمه کلیدی implements پیادهسازی میکنند، موظفاند متدهای تعریفشده در آن را پیادهسازی کنند.
Constant
ثابت (Constant) متغیری است که مقدار آن پس از مقداردهی قابل تغییر نیست.
در جاوا، ثابتها معمولاً با ترکیب static final تعریف میشوند تا به کلاس وابسته باشند و پس از مقداردهی تغییر نکنند.
Polymorphism
چندریختی (Polymorphism) توانایی یک مرجع (Reference) از نوع کلاس والد یا Interface برای اشاره به اشیایی از انواع مختلف کلاسهای فرزند و اجرای رفتار ویژه هر یک از آنها است.
نکات مهم مصاحبهای
تفاوت اصلی Abstract Class و Interface در چیست؟
کلاس abstract میتواند دارای وضعیت (State)، یعنی فیلدهای غیراستاتیک، و همچنین Constructor باشد. ارثبری از کلاس در جاوا تکگانه است؛ یعنی هر کلاس فقط میتواند از یک کلاس والد ارثبری کند.
اما Interface معمولاً برای تعریف رفتارها یا قابلیتها (Capabilities) استفاده میشود، Constructor ندارد و امکان پیادهسازی چند Interface را برای یک کلاس فراهم میکند.
آیا Abstract Class میتواند Constructor داشته باشد؟
بله. با وجود اینکه نمیتوان مستقیماً از یک کلاس abstract نمونهسازی کرد، Constructor آن هنگام ساختهشدن نمونهای از کلاس فرزند فراخوانی میشود تا فیلدهای کلاس والد مقداردهی اولیه شوند.
چرا نمیتوان از یک Abstract Class نمونه ساخت؟
یک کلاس abstract ممکن است شامل متدهای abstract باشد که بدنه و پیادهسازی ندارند.
در این شرایط، JVM نمیداند هنگام فراخوانی چنین متدی چه عملیاتی باید اجرا شود؛ بنابراین نمیتوان مستقیماً از کلاس abstract شیء ساخت.
کاربرد متدهای default در Interfaceها چیست؟
متدهای default در جاوا نسخه 8 معرفی شدند تا بتوان بدون شکستن کدهای قبلی، یعنی حفظ Backward Compatibility، متدهای جدیدی به Interfaceهایی اضافه کرد که پیشتر توسط کلاسهای زیادی پیادهسازی شدهاند.
مثال یا سناریوی کاربردی
در این سناریو، یک سیستم مدیریت پارکینگ طراحی میشود:
۱. یک کلاس abstract با نام Vehicle تعریف میکنیم. این کلاس ویژگیهای مشترکی مانند licensePlate و یک متد انتزاعی با نام calculateParkingFee برای محاسبه هزینه پارکینگ دارد.
۲. کلاسهای فرزند Car، Motorcycle و Truck از کلاس Vehicle با کلمه کلیدی extends ارثبری میکنند. هر کلاس، فرمول اختصاصی محاسبه هزینه را در متد calculateParkingFee پیادهسازی میکند.
۳. یک Interface با نام Loggable برای ثبت رویدادها در کنسول تعریف میکنیم. کلاسها میتوانند علاوه بر ارثبری از کلاس والد، این Interface را نیز با implements پیادهسازی کنند.
بیشتر بدانید
IDE Tip
در محیط IntelliJ، اگر یک کلاس متدهای انتزاعی موردنیاز را پیادهسازی نکرده باشد، روی نام کلاس کلیدهای Alt + Enter را فشار دهید تا قالب متدهای لازم بهصورت خودکار ایجاد شود.
Naming Convention
طبق قراردادهای نامگذاری در جاوا، متغیرهای ثابت که با static final تعریف میشوند، باید با حروف بزرگ نامگذاری شوند و کلمات آنها با علامت _ از هم جدا شوند؛ برای مثال، MAX_CAPACITY.
