سازهی اصلی شیءگرا در Java، «کلاس» است؛ ترکیبی از داده («فیلد») و رفتار («متد»). به فیلدها و متدهای یک کلاس، «اعضای» آن گفته میشود.
دسترسی به اعضا را میتوان با اصلاحکنندههای دسترسی کنترل کرد که دو مورد از رایجترینشان اینها هستند:
public: هر کدی میتواند به این عضو دسترسی داشته باشد (بدون محدودیت).private: فقط کدی که در همان کلاس است میتواند به این عضو دسترسی داشته باشد.میتوانید کلاس را بهعنوان قالبی برای ساختن نمونههایی از آن در نظر بگیرید.
برای ساختن یک نمونه از کلاس (که به آن «شیء» هم میگویند)، از کلیدواژهی new استفاده میشود:
class Car {
}
// Create two car instances
Car myCar = new Car();
Car yourCar = new Car();
فیلدها یک نوع و یک اسم دارند (بهصورت camelCase نوشته میشوند) و میتوان آنها را در هر جای کلاس تعریف کرد (بر اساس قرارداد، اسم کلاسها بهصورت PascalCase نوشته میشود):
class Car {
// Accessible by anyone
public int weight;
// Only accessible by code in this class
private String color;
}
میتوان بهصورت اختیاری یک مقدار اولیه به یک فیلد اختصاص داد. اگر فیلدی مقدار اولیهای تعیین نکند، روی مقدار پیشفرض نوعش تنظیم میشود. میتوان با نشانهگذاری نقطهای به مقدار فیلدهای یک نمونه دسترسی داشت و آنها را بهروزرسانی کرد.
class Car {
// Will be set to specified value
public int weight = 2500;
// Will be set to default value (0)
public int year;
}
Car newCar = new Car();
newCar.weight; // => 2500
newCar.year; // => 0
// Update value of the field
newCar.year = 2018;
فیلدهای خصوصی معمولاً بهعنوان اثر جانبی فراخوانی یک متد بهروزرسانی میشوند.
این متدها معمولاً مقداری برنمیگردانند؛ در این صورت نوع بازگشتی باید void باشد:
class CarImporter {
private int carsImported;
public void importCars(int numberOfCars)
{
// Update private field from public method
carsImported = carsImported + numberOfCars;
}
}
در این تمرین با یک ماشین کنترلی بازی میکنید؛ ماشینی که بالاخره پول کافی برای خریدنش را پسانداز کردهاید.
ماشینها با باتری کاملاً پر (۱۰۰٪) شروع میکنند. هر بار که ماشین را با کنترل از راه دور میرانید، ۲۰ متر را طی میکند و یک درصد از باتری را خالی میکند.
ماشین کنترلی یک نمایشگر LED شیک دارد که دو بخش از اطلاعات را نشان میدهد:
"Driven <METERS> meters"."Battery at <PERCENTAGE>%".اگر باتری ۰٪ باشد، دیگر نمیتوانید ماشین را برانید و نمایشگر باتری "Battery empty" را نشان میدهد.
شما شش کار دارید که هر کدام با نمونهای از ماشین کنترلی کار میکند.
متد (static) JedliksToyCar.buy() را پیادهسازی کنید تا یک نمونهی کاملاً نو از ماشین کنترلی برگرداند:
JedliksToyCar car = JedliksToyCar.buy();
متد JedliksToyCar.distanceDisplay() را پیادهسازی کنید تا مسافت را همانطور که روی نمایشگر LED نشان داده میشود برگرداند:
JedliksToyCar car = JedliksToyCar.buy();
car.distanceDisplay();
// => "Driven 0 meters"
متد JedliksToyCar.batteryDisplay() را پیادهسازی کنید تا درصد شارژ باتری را همانطور که روی نمایشگر LED نشان داده میشود برگرداند:
JedliksToyCar car = JedliksToyCar.buy();
car.batteryDisplay();
// => "Battery at 100%"
متد JedliksToyCar.drive() را پیادهسازی کنید که تعداد مترهای طیشده را بهروزرسانی میکند:
JedliksToyCar car = JedliksToyCar.buy();
car.drive();
car.drive();
car.distanceDisplay();
// => "Driven 40 meters"
متد JedliksToyCar.drive() را بهروزرسانی کنید تا درصد شارژ باتری را هم بهروزرسانی کند:
JedliksToyCar car = JedliksToyCar.buy();
car.drive();
car.drive();
car.batteryDisplay();
// => "Battery at 98%"
متد JedliksToyCar.drive() را بهروزرسانی کنید تا وقتی باتری خالی است (۰٪)، نه مسافت طیشده را افزایش دهد و نه درصد شارژ باتری را کاهش دهد:
JedliksToyCar car = JedliksToyCar.buy();
// Drain the battery
// ...
car.distanceDisplay();
// => "Driven 2000 meters"
car.batteryDisplay();
// => "Battery empty"