در بخش اشیا، کلاسها و Interfaceها با مفاهیم برنامهنویسی شیگرا آشنا شدیم. آنجا از کلاس Bicycle بهعنوان نمونه استفاده کردیم و زیرکلاسهایی مثل دوچرخهٔ کورسی، کوهستان و دونفره داشتیم. کد زیر یک پیادهسازی نمونه از کلاس Bicycle را نشان میدهد تا دید کلی نسبت به ساختار یک کلاس Declaration به دست آید.
نکته: در این مرحله نیازی نیست جزئیات کد را موشکافی کنید. بخشهای بعدی هر قسمت را قدمبهقدم توضیح میدهند.
public class Bicycle {
// کلاس Bicycle دارای
// سه فیلد (Field) است
public int cadence;
public int gear;
public int speed;
// کلاس Bicycle دارای
// یک Constructor است
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
// کلاس Bicycle دارای
// چهار Method است
public void setCadence(int newValue) {
cadence = newValue;
}
public void setGear(int newValue) {
gear = newValue;
}
public void applyBrake(int decrement) {
speed -= decrement;
}
public void speedUp(int increment) {
speed += increment;
}
}
فرض کنید بخواهیم کلاس MountainBike را بهعنوان زیرکلاس (Subclass) کلاس Bicycle تعریف کنیم. اعلامیهٔ کلاس چیزی شبیه به این خواهد بود:
public class MountainBike extends Bicycle {
// زیرکلاس MountainBike دارای
// یک فیلد اضافی است
public int seatHeight;
// زیرکلاس MountainBike دارای
// یک Constructor است
public MountainBike(int startHeight, int startCadence,
int startSpeed, int startGear) {
super(startCadence, startSpeed, startGear);
seatHeight = startHeight;
}
// زیرکلاس MountainBike دارای
// یک Method اضافی است
public void setHeight(int newValue) {
seatHeight = newValue;
}
}
کلاس MountainBike تمام فیلدها و Methodهای کلاس Bicycle را به ارث میبرد و در عین حال فیلد seatHeight و یک Method برای تنظیم آن را اضافه میکند. (در دوچرخههای کوهستانی، زین قابلیت حرکت به بالا و پایین متناسب با شرایط زمین را دارد.)
[دیاگرام: رابطهٔ ارثبری (Inheritance) بین کلاس Bicycle و زیرکلاس MountainBike]
---تا اینجا کلاسها را به این شکل دیدهاید:
class MyClass {
// تعریف فیلدها، Constructor و Methodها
}
این همان Class Declaration (اعلامیهٔ کلاس) است. بخش داخل براکتها — که به آن Class Body (بدنهٔ کلاس) گفته میشود — شامل تمام کدهایی است که چرخهٔ عمر اشیای ساختهشده از کلاس را مدیریت میکند. این شامل سه بخش اصلی است:
اعلامیهٔ کلاسی که بالاتر دیدیم، حداقلیترین شکل ممکن بود. فقط اجزای ضروری را شامل میشد. اما میتوان اطلاعات بیشتری در ابتدای اعلامیهٔ کلاس اضافه کرد — مثلاً نام Superclass، یا اینکه کلاس چه Interfaceهایی را پیادهسازی میکند:
class MyClass extends MySuperClass implements YourInterface {
// تعریف فیلدها، Constructor و Methodها
}
این اعلامیه میگوید که MyClass یک زیرکلاس از MySuperClass است و Interface به نام YourInterface را پیادهسازی میکند.
همچنین میتوان Modifierهایی مثل public یا private را در ابتدای اعلامیه اضافه کرد. این کار باعث میشود خط اول اعلامیهٔ کلاس کمی پیچیدهتر به نظر برسد. Modifierهای public و private تعیین میکنند که کدام کلاسها میتوانند به MyClass دسترسی داشته باشند — دربارهٔ آنها بعداً بحث خواهیم کرد. همچنین کلمات کلیدی extends و implements در بخش Interface و Inheritance بهتفصیل توضیح داده میشوند.
نکته: فعلاً نیازی نیست نگران این جزئیات اضافی باشید.
بهطور کلی، یک اعلامیهٔ کلاس میتواند شامل این اجزا و به این ترتیب باشد:
public، private و تعدادی دیگر که بعداً با آنها آشنا خواهید شد. (البته توجه کنید که Modifier private فقط روی Nested Classes قابل اعمال است.)extends مشخص میشود. هر کلاس فقط میتواند از یک والد ارث ببرد.implements مشخص میشود. برخلاف ارثبری، یک کلاس میتواند چندین Interface را همزمان پیادهسازی کند.{}.در جاوا چند نوع متغیر وجود دارد:
کلاس Bicycle فیلدهای خود را با کد زیر تعریف میکند:
public int cadence;
public int gear;
public int speed;
هر اعلامیهٔ فیلد از سه بخش تشکیل شده است:
public یا private.فیلدهای کلاس Bicycle به ترتیب cadence، gear و speed نام دارند و همگی از نوع عدد صحیح (int) هستند. کلمهٔ کلیدی public این فیلدها را بهعنوان اعضای عمومی (Public Members) معرفی میکند؛ یعنی هر شیئی که به کلاس دسترسی داشته باشد، میتواند به آنها نیز دسترسی پیدا کند.
Modifier اول (سمت چپ) در اعلامیهٔ یک فیلد مشخص میکند که کدام کلاسها میتوانند به آن فیلد دسترسی داشته باشند. در اینجا فقط دو Modifier اصلی را بررسی میکنیم:
public — فیلد از تمام کلاسها قابل دسترسی است.private — فیلد فقط در داخل همان کلاس قابل دسترسی است.نکته: استثنائاتی در این قوانین وجود دارد که در ادامهٔ این بخش بررسی خواهد شد.
در فلسفهٔ Encapsulation (کپسولهسازی)، رایج است که فیلدها را private تعریف کنیم. یعنی فقط از داخل خود کلاس Bicycle قابل دسترسی مستقیم هستند. اما معمولاً نیاز داریم مقادیر این فیلدها را از بیرون کلاس بخوانیم. راهحل؟ اضافهکردن Methodهای عمومی که مقادیر فیلدها را برگردانند:
public class Bicycle {
private int cadence;
private int gear;
private int speed;
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
public int getCadence() {
return cadence;
}
public void setCadence(int newValue) {
cadence = newValue;
}
public int getGear() {
return gear;
}
public void setGear(int newValue) {
gear = newValue;
}
public int getSpeed() {
return speed;
}
public void applyBrake(int decrement) {
speed -= decrement;
}
public void speedUp(int increment) {
speed += increment;
}
}
[دیاگرام: نمایش مفهوم Encapsulation — دسترسی مستقیم به فیلدها مسدود شده و دسترسی فقط از طریق Methodهای Getter/Setter امکانپذیر است]
---هر متغیری باید یک نوع داشته باشد. این نوع میتواند از انواع اولیه (Primitive Types) مثل int، float، boolean و غیره باشد، یا از انواع ارجاعی (Reference Types) مثل رشتهها (String)، آرایهها (Arrays) و اشیا (Objects).
تمام متغیرها — چه فیلد باشند، چه متغیر محلی، چه پارامتر — از قوانین و قراردادهای نامگذاری یکسانی پیروی میکنند. این قوانین قبلاً در بخش مفاهیم پایهٔ زبان، در صفحهٔ نامگذاری متغیرها بررسی شدهاند.
همین قوانین و قراردادها برای نامگذاری Methodها و کلاسها نیز صدق میکنند — با این دو تفاوت:
setSpeed، applyBrake).این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/