به عنوان یک زبان که مفاهیم شی گرایی را در خود پیاده سازی کرده است، زبان برنامه نویسی جاوا از مفاهیم اصلی شی گرایی پشتیبانی می کند. این مفاهیم شامل موارد زیر هستند:
در این قسمت در رابطه با این مفاهیم به طور مفصل تری صحبت خواهیم کرد. اما در ابتدا نگاهی به مفهوم بسیار مهم object و class خواهیم انداخت.
حال که کمی در رابطه با object ها و class ها و تفاوت آنها صحبت کردیم، بگذارید در رابطه با object ها به طور مفصل تری صحبت کنیم. اگر به دنیای اطراف خود نگاه کنید، object های بسیاری از قبیل؛ ماشین ها، حیوانات، انسان ها و دیگر اشیا را خواهید دید. تمامی این object ها دارای، state و behavior می باشد. برای مثال؛ اگر یک حیوان را در نظر بگیریم، state و یا حالت آن، شامل مواردی از قبیل؛ نام، گونه جانوری، رنگ و رفتارهای از قبیل؛ حرکت کردن، خوردن و ایجاد صدا می باشند. حال، اگر همین فضا را با یک نرم افزار مقایسه کنید، می بینید که شباهت های بسیار زیادی وجود دارد.
اشیاء و یا object هایی که در یک نرم افزار تولید شدهاند نیز دارای state و behavior هستند. یک state از یک object در یک نرمافزار، در درون فیلد ها تعریف می گردند. و behavior ها با استفاده از متدها پیاده سازی می شوند. بنابراین در توسعه نرم افزار، متدها بر روی state درونی و یا اصطلاحاً internal state مربوط به یک object، عملیاتی را انجام می دهند و ارتباط بین object ها با یکدیگر از طریق متد ها انجام می پذیرد.
یک class یک نقشه و یا یک الگو است که از آن می توان object های مختلفی را ایجاد کرد. کدی که در قسمت زیر مشاهده می کنید، نحوه تعریف کردن یک کلاس در زبان برنامه نویسی جاوا را نشان می دهد.
public
class
Dog {
String breed;
int
age;
String color;
void
barking() {
}
void
hungry() {
}
void
sleeping() {
}
}
همانطور که مشاهده کردید؛ یک class می تواند تعداد زیادی از متدها را در کنار متغیرها داشته باشند. این متدها میتوانند به مقادیر درون متغیر ها دسترسی پیدا کنند. در مثال های بالا؛ متدهایی برای کلاس dog از قبیل؛ barking و hungry و sleeping را می توان تعریف کرد. در ادامه می بایست موضوعات بسیار مهم تری را در رابطه با class ها در زبان برنامه نویسی جاوا بررسی کنیم.
زمانی که مبحث class ها مطرح میشود، یکی از موضوعات بسیار بسیار مهم، مبحث توابع سازنده و یا constructor می باشند. هر class می تواند یک تابع سازنده و یا constructor داشته باشد. اگر برای یک کلاس، صراحتاً، یک تابع سازنده تعریف نکنید، کامپایلر جاوا یک تابع سازنده پیش فرض و یا اصطلاحاً default constructor را برای آن class تعریف میکند.
هرگاه یک object جدید ایجاد می شود، حداقل یک تابع سازنده ایجاد خواهد شد و سپس اجرا خواهد گردید. قانون اصلی که باید همیشه در استفاده کردن از توابع سازنده در نظر گرفته شود، این است که نام یک تابع سازنده، همیشه باید با این نام یک class یکسان باشد. علاوه بر این؛ یک class می تواند بیش از یک تابع سازنده داشته باشد. کدی که در قسمت زیر مشاهده می کنید، نحوه تعریف کردن یک class و سپس لحاظ کردن یک تابع سازنده برای آن را نشان می دهد.
public
class
Puppy {
public
Puppy() {
}
public
Puppy(String name) {
// This constructor has one parameter, name.
}
}
زبان برنامه نویسی جاوا از کلاس های تکین و یا اصلاحاً singleton class ها نیز پشتیبانی می کند. ماهیت singleton class ها به این ترتیب است که از آنها فقط و فقط می توان یک object و یا instance ایجاد کرد. نکته دیگر اینکه؛ تا به اینجای کار متوجه شدیم که دو نوع تابع سازنده را میتوان در یک class داشت. در رابطه با موضوعات دقیقتر مربوط به توابع سازنده در قسمت های بعدی به طور مفصل تری صحبت خواهیم کرد.
همانطور که قبلاً گفتیم؛ یک class به عنوان یک نقشه و یا الگو برای object هایی می باشد که پس از تعریف شدن class، از آن class ایجاد می گردند. پس اساساً یک object از یک class ایجاد می گردد. در زبان برنامه نویسی جاوا، شبیه به زبان برنامه نویسی سی شارپ، از کلمهی کلیدی new برای ایجاد کردن object ها استفاده می کنیم. برای ایجاد کردن یک object از یک class، به طور کلی سه مرحله وجود دارد که آنها را در این قسمت بررسی کرده و توصیه میکنیم که از کلمات فنی آنها نیز استفاده کنید.
کدی که در قسمت زیر مشاهده می کنید، نحوه انجام دادن این سه مرحله ی بسیار مهم در ساختن یک object از یک class را نشان می دهد.
public
class
Puppy {
public
Puppy(String name) {
// This constructor has one parameter, name.
System.out.println("Passed Name is :"
+ name );
}
public
static
void
main(String []args) {
// Following statement would create an object myPuppy
Puppy myPuppy = new
Puppy( "tommy"
);
}
}
اگر کدی که در قسمت بالا مشاهده کردید را کامپایل و سپس اجرا کنیم، خروجی که در قسمت زیر مشاهده می شود، ایجاد خواهد شد.
خروجی:
Passed Name is :tommy
در قسمت های قبلی در رابطه با instance variable ها و متدها صحبت کردیم و می دانیم که میتوان با استفاده از object های تعریف شده از یک class به آنها دسترسی پیدا کرد. برای دسترسی پیدا کردن به instance variable ها میتوانیم از مسیر معتبر کامل آنها که اصطلاحاً تحت عنوان qualified path نیز نامیده می شود، استفاده کرد. این موضوع در کد زیر نشان داده شده است.
/* First create an object */
ObjectReference = new
Constructor();
/* Now call a variable as follows */
ObjectReference.variableName;
/* Now you can call a class method as follows */
ObjectReference.MethodName();
علاوه بر این؛ مثالی که در قسمت زیر مشاهده می کنید، نحوه دسترسی پیدا کردن به instance variable ها و متدهای یک کلاس را نشان میدهد.
public
class
Puppy {
int
puppyAge;
public
Puppy(String name) {
// This constructor has one parameter, name.
System.out.println("Name chosen is :"
+ name );
}
public
void
setAge( int
age ) {
puppyAge = age;
}
public
int
getAge( ) {
System.out.println("Puppy's age is :"
+ puppyAge );
return
puppyAge;
}
public
static
void
main(String []args) {
/* Object creation */
Puppy myPuppy = new
Puppy( "tommy"
);
/* Call class method to set puppy's age */
myPuppy.setAge( 2
);
/* Call another class method to get puppy's age */
myPuppy.getAge( );
/* You can access instance variable as follows as well */
System.out.println("Variable Value :"
+ myPuppy.puppyAge );
}
}
با کامپایل کردن و سپس اجرا نمودن کدی که در قسمت بالا دیدیم، خروجی زیر تولید خواهد شد.
خروجی:
Name chosen is :tommy
Puppy’s age is :2
Variable Value :2
منبع: وبسایت پرووید