شي ها و كلاس ها در جاوا
جاوا يك زبان شي گرا است. همانند ساير زبان هاي شي گرا كه داراي ويژگي هاي شي گرايي هستند، جاوا نيز از مفاهيم اساسي زير پشتيباني مي كند:
- چند ريختي
- وراثت
- كپسوله سازي
- انتزاع – مفهوم – برداشت
- كلاس ها
- اشياء
- نمونه
- متد
- پيام تجزيه
در اين در قسمت از آموزش جاوا، به مفاهيم كلاس و اشياء نگاهي خواهيم كرد.
شي: اشياء يكسري خصوصيات (states) و رفتارها (behaviors) را دارند . به عنوان مثال:سگ خصوصياتي مثل رنگ، نام، نژاد و همچنين رفتارهايي مانند تكان خوردن، پارس كردن و غذا خوردن را دارد. شي يك نمونه از كلاس است.
كلاس: كلاس الگو يا طرحي است كه رفتارها و خصوصيات اشيايي كه از آن پشتيباني مي كنند را توصيف مي كند.
اشيا در جاوا
در اين قسمت كمي عميق تر به اينكه اشيا چه چيزي هستند، نگاه مي كنيم. اگر دنياي واقعي را در نظر بگيريم، مي توانيم اشياي زيادي را در اطراف خودمان پيدا كنيم. مانند، ماشين ها ، سگ ها، انسان ها و غيره. همه اين شي ها خصوصيات و رفتارهايي دارند.
اگر سگ را بررسي كنيم، خصوصيات آن عبارت خواهند بود از : نام، نژاد، رنگ و رفتارهاي آن عبارت خواهند بود از: تكان خوردن، پارس كردن، خوردن.
اگر اشيا در نرم افزار را با اشياي دنياي واقعي مقايسه كنيم، آنها كاراكترهاي مشابه خيلي زيادي با هم خواهند داشت.
شي ها در نرم افزار نيز رفتارها و خصوصيات دارند. خصوصيات اشياي نرم افزار در فيلدها (fields) ذخيره مي شوند و رفتارها با متدها نشان داده مي شوند.
بنابراين در توسعه نرم افزار، متدها روي خصوصيات داخلي يك شي عمل مي كنند و ارتباط شي با شي نيز با متدها انجام مي گيرد.
كلاس ها در جاوا
كلاس طرحي است كه از شي هاي منحصر بفرد ساخته مي شود.
يك نمونه از كلاس در زير آورده شده است:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class Dog{
String breed;
int ageC
String color;
void barking(){
}
void hungry(){
}
void sleeping(){
}
}
|
يك كلاس مي تواند شامل هر يك از انواع متغير هاي زير باشد:
متغيرهاي محلي (Local variables):
متغيرهاي تعريف شده در داخل متدها، سازنده و يا بلوك ها، متغيرهاي محلي ناميده مي شوند. اين متغير در داخل متد تعريف و مقدار دهي اوليه خواهد شد و متغير زماني كه متد به آخر رسانده شده است، نابود خواهد شد.
متغيرهاي نمونه (Instance variables):
متغيرهاي نمونه، متغيرها¬يي هستند كه داخل كلاس اما در خارج متدها باشند. اين متغيرها زماني كه كلاس ايجاد مي شود مقداردهي اوليه مي شوند .متغيرهاي نمونه مي توانند از داخل متدها، سازنده و يا بلوك¬هاي آن كلاس قابل دسترسي باشند.
متغيرهاي كلاس (Class variables):
متغيرهاي كلاس، متغيرهايي هستند كه در كلاس و خارج از متدها، با كلمه كليدي استاتيك (static) تعريف مي شوند.
يك كلاس مي تواند هر تعداد از متدها را براي دسترسي به مقدار انواع متدها داشته باشد. در مثال بالا، hungry() , sleeping() و barking() متد هستند.
زماني كه به دنبال مطالعه كلاس ها در زبان جاوا هستيم، بايد موضوعات مهمي كه در زير بحث شده اند را بدانيم.
سازنده ها (Constructors):
در بحث كلاس ها، يكي از مهم ترين موضوعات فرعي سازنده است. هر كلاس داراي يك سازنده است. اگر ما به صراحت سازنده را براي يك كلاس ننويسيم، كامپايلر جاوا يك سازنده پيش فرض براي آن كلاس ايجاد مي كند.
هر بار كه يك شي جديد ايجاد مي شود، حداقل يك سازنده فراخواني مي شود .قانون اصلي سازنده اين است كه نام آنها بايد هم نام با كلاس¬شان باشد. يك كلاس مي تواند بيش از يك سازنده داشته باشد.
مثالي از سازنده در زير آورده شده است:
1
2
3
4
5
6
7
8
|
public class Puppy{
public Puppy(){
}
public Puppy(String name){
}
}
|
نحوه ايجاد شي در برنامه نويسي جاوا
همانطور كه قبلا ذكر شد، كلاس طرحي براي اشياء فراهم مي كند. بنابراين اساسا يك آبجكت يا شي از يك كلاس ايجاد شده است. در جاوا، كلمه كليدي new براي ايجاد اشياء جديد استفاده مي شود.
سه مرحله در هنگام ايجاد يك شي از كلاس وجود دارد:
- تعريف يا اعلان (Declaration): اعلان متغير با نام متغير و نوع شي.
- نمونه ها (Instantiation): كلمه كليدي ‘new’ براي ايجاد شي استفاده مي شود.
- مقدار دهي اوليه: به دنبال كلمه كليدي ‘new’ ، سازنده فراخواني مي شود. اين فراخواني شي جديد را مقدار دهي اوليه مي كند.
به عنوان مثال ايجاد يك شي در زير آورده شده است:
1
2
3
4
5
6
7
8
9
10
11
12
|
public class Puppy{
public Puppy(String name){
System.out.println( "Passed Name is :" + name );
}
public static void main(String []args){
Puppy myPuppy = new Puppy( "tommy" );
}
}
|
اگر برنامه فوق كامپايل و اجرا شود ، نتايج زير را توليد مي كند:
Passed Name is :tommy
دسترسي به متغيرهاي نمونه و متدها:
متغيرهاي نمونه و متدها از طريق اشياء ايجاد شده قابل دسترسي هستند. روش خوب براي دسترسي به متغير نمونه به شرح زير مي باشد:
1
2
3
4
5
6
7
8
|
ObjectReference = new Constructor();
ObjectReference.variableName;
ObjectReference.MethodName();
|
مثال:
در اين مثال چگونگي دسترسي به متغيرهاي نمونه و متدهاي يك كلاس شرح داده شده است:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
public class Puppy{
int puppyAge;
public Puppy(String 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){
Puppy myPuppy = new Puppy( "tommy" );
myPuppy.setAge( 2 );
myPuppy.getAge( );
System.out.println( "Variable Value :" + myPuppy.puppyAge );
}
}
|
اگر برنامه فوق كامپايل و اجرا شود، نتايج زير را توليد خواهد كرد:
Name chosen is :tommy Puppy’s age is :2 Variable Value :2
قوانين اعلان فايل منبع:
به عنوان آخرين بخش از اين قسمت اجازه دهيد به قوانين اعلان فايل منبع بپردازيم. اين قوانين در هنگام تعريف كلاس ها، وارد كردن خصوصيات و بسته خصوصيات در يك فايل منبع ضروري است.
- مي تواند تنها يك كلاس عمومي براي هر فايل منبع وجود داشته باشد.
- يك فايل منبع مي توانيد چندين كلاس غير عمومي داشته باشد.
- نام كلاس عمومي بايد نام فايل منبع باشد و همچنين بايد به آخر آن java. اضافه شوند. به عنوان مثال: نام كلاس public class Employee{} است پس فايل منبع بايد java باشد.
- اگر كلاس در داخل يك بسته تعريف شده است، پس تعريف بسته بايد اولين تعريف در فايل منبع باشد.
- اگر از import استفاده شده است پس بايد بين تعريف بسته و تعريف كلاس نوشته شود. اگر هيچ تعريف بسته اي وجود نداشته باشد آنگاه import بايد در خط اول فايل منبع باشد.
- import و تعريف بسته به همه كلاسهاي موجود در فايل منبع اعمال خواهد شد. تعريف import و بسته مختلف به كلاس هاي مختلف در فايل منبع غير ممكن است.
- كلاس داراي چندين سطح دسترسي هستند و انواع مختلفي از كلاس وجود دارد. كلاسهاي انتزاعي، كلاس هاي نهايي، و غيره. ما در مورد تمام اين كلاس ها توضيح خواهيم داد.
جدا از انواع كلاس هاي ذكر شده در بالا، جاوا همچنين داراي برخي از كلاس هاي خاص به نام كلاس هاي داخلي و كلاس هاي ناشناس(Anonymous) است.
بسته ها در جاوا:
به طور ساده، بسته يك راه طبقه بندي كلاس ها و رابط¬ها است. هنگامي كه برنامه هاي كاربردي به زبان جاوا توسعه پيدا مي كنند، صدها كلاس ها و رابط نوشته خواهند شد، بنابراين طبقه بندي اين كلاس¬ها اجباري است و همچنين باعث بقاي بسيار ساده تر برنامه مي شود.
تعريف Import :
در جاوا اگر يك نام كامل، شامل بسته و نام كلاس، داده شده باشد، كامپايلر به راحتي مي توانيد كد منبع و يا كلاس را مكان يابي كند. Import statement راهي براي مشخص كردن موقعيت مناسب براي كامپايلر براي پيدا كردن كلاس خاص است.
به عنوان مثال، خط زير از كامپايلر مي خواهد تا تمام كلاس هاي موجود در دايركتور java_installation/java/io را بارگذاري نمايد.
حالا به يك مثال كاربردي از مباحثي كه در اين آموزش مطرح شد مي پردازيم تا كاملا با مفهوم شي و كلاس در جاوا آشنا شويد.
در اين مطالعه موردي دو كلاس به نام هاي Employee و EmployeeTest ايجاد خواهيم كرد.
ابتدا notepad را باز كرده و كد زير را اضافه كنيد. به ياد داشته باشيد اين، كلاس Employee است و كلاس يك كلاس عمومي است. اكنون، اين فايل منبع را با نام Employee.java. ذخيره كنيد.
كلاس Employee داراي چهار متغيرهاي نمونه name, age, designation وsalary است. اين كلاس داراي يك سازنده است كه صريحا تعريف شده است، كه طول پارامتر مي گيرد.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import java.io.*;
public class Employee{
String name;
int age;
String designation;
double salary;
public Employee(String name){
this .name = name;
}
public void empAge( int empAge){
age = empAge;
}
public void empDesignation(String empDesig){
designation = empDesig;
}
public void empSalary( double empSalary){
salary = empSalary;
}
public void printEmployee(){
System.out.println( "Name:" + name );
System.out.println( "Age:" + age );
System.out.println( "Designation:" + designation );
System.out.println( "Salary:" + salary);
}
}
|
همانطور كه قبلا در اين آموزش گفته شد، پردازش از متد اصلي شروع مي شود. بنابراين در اينجا كلاس Employee بايد اجرا شود تا متداصلي و اشياء ايجاد شوند. ما يك كلاس جداگانه براي انجام اين كارها ايجاد خواهيم كرد.
در زير كلاس EmployeeTest آورده شده است، كه دو نمونه از كلاس Employee ايجاد مي كند و براي هر شي متدها را فراخواني مي كند تا براي هر متغيير مقاديري را تخصيص دهد.
كد زير را در فايل EmployeeTest.java ذخيره كنيد.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import java.io.*;
public class EmployeeTest{
public static void main(String args[]){
Employee empOne = new Employee( "James Smith" );
Employee empTwo = new Employee( "Mary Anne" );
empOne.empAge( 26 );
empOne.empDesignation( "Senior Software Engineer" );
empOne.empSalary( 1000 );
empOne.printEmployee();
empTwo.empAge( 21 );
empTwo.empDesignation( "Software Engineer" );
empTwo.empSalary( 500 );
empTwo.printEmployee();
}
}
|
اكنون اگر هر دو كلاس را كامپايل كرده و سپس كلاس EmployeeTest را اجرا كنيد نتايج را همانند زير مشاهده خواهيد كرد.
C:> javac Employee.java C:> javac EmployeeTest.java C:> java EmployeeTest Name:James Smith Age:26 Designation:Senior Software Engineer Salary:1000.0 Name:Mary Anne Age:21 Designation:Software Engineer Salary:500.0
بازدید: