ساختار اصلی شیءگرا در جاوا «کلاس» است؛ یک کلاس ترکیبی از دادهها (فیلدها که به آنها متغیرهای نمونه هم میگویند) و رفتار (متدها) است. فیلدها و متدهای یک کلاس اعضای آن به شمار میروند.
دسترسی به اعضا را میتوان از طریق «اصلاحکنندههای دسترسی» کنترل کرد. دو مورد از رایجترین آنها:
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
carsImported = carsImported + numberOfCars;
}
}
توجه داشته باشید که استفاده از فیلدهای عمومی در کلاسهای جاوا مرسوم نیست. معمولاً از فیلدهای خصوصی استفاده میشود که دسترسی به آنها از طریق گیرندهها و تنظیمکنندهها انجام میگیرد.
درون یک کلاس، کلیدواژهی this به کلاس جاری اشاره میکند. این موضوع بهویژه زمانی مفید است که اسم یک پارامتر با اسم یک فیلد یکسان باشد:
class CarImporter {
private int carsImported;
public void setImportedCars(int carsImported)
{
// Update private field from public method
this.carsImported = carsImported;
}
}