به روزترين وبلاگ
 

 

شي ها و كلاس ها در جاوا

جاوا يك زبان شي گرا است. همانند ساير زبان هاي شي گرا كه داراي ويژگي هاي شي گرايي هستند، جاوا نيز از مفاهيم اساسي زير پشتيباني مي كند:

  • چند ريختي
  • وراثت
  • كپسوله سازي
  • انتزاع – مفهوم – برداشت
  • كلاس ها
  • اشياء
  • نمونه
  • متد
  • پيام تجزيه

 

در اين در قسمت از آموزش جاوا، به مفاهيم كلاس و اشياء نگاهي خواهيم كرد.
شي: اشياء يكسري خصوصيات (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){
      // This constructor has one parameter, 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){
      // 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

دسترسي به متغيرهاي نمونه و متدها:

متغيرهاي نمونه و متدها از طريق اشياء ايجاد شده قابل دسترسي هستند. روش خوب براي دسترسي به متغير نمونه به شرح زير مي باشد:

1
2
3
4
5
6
7
8
/* 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();

مثال:
در اين مثال چگونگي دسترسي به متغيرهاي نمونه و متدهاي يك كلاس شرح داده شده است:

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){
      // 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

قوانين اعلان فايل منبع:

به عنوان آخرين بخش از اين قسمت اجازه دهيد به قوانين اعلان فايل منبع بپردازيم.  اين قوانين در هنگام تعريف كلاس ها، وارد كردن خصوصيات و بسته خصوصيات در يك فايل منبع ضروري است.

  • مي تواند تنها يك كلاس عمومي براي هر فايل منبع وجود داشته باشد.
  • يك فايل منبع مي توانيد چندين كلاس غير عمومي داشته باشد.
  • نام كلاس عمومي بايد نام فايل منبع باشد و همچنين بايد به آخر آن java. اضافه شوند. به عنوان مثال: نام كلاس public class Employee{} است پس فايل منبع بايد java باشد.
  • اگر كلاس در داخل يك بسته تعريف شده است، پس تعريف بسته بايد اولين تعريف در فايل منبع باشد.
  • اگر از import استفاده شده است پس بايد بين تعريف بسته و تعريف كلاس نوشته شود. اگر هيچ تعريف بسته اي وجود نداشته باشد آنگاه import  بايد در خط اول فايل منبع  باشد.
  • import و تعريف بسته به همه كلاس­هاي موجود در فايل منبع اعمال خواهد شد. تعريف import و  بسته مختلف  به كلاس هاي مختلف در فايل منبع غير ممكن است.
  • كلاس داراي چندين سطح دسترسي هستند و انواع مختلفي از كلاس وجود دارد. كلاسهاي انتزاعي، كلاس هاي نهايي، و غيره. ما در مورد تمام اين كلاس ها توضيح خواهيم داد.

جدا از انواع كلاس هاي ذكر شده در بالا، جاوا همچنين داراي برخي از كلاس هاي خاص به نام كلاس هاي داخلي و كلاس هاي ناشناس(Anonymous) است.

بسته ها در جاوا:

به طور ساده، بسته يك راه طبقه بندي كلاس ها و رابط¬ها است. هنگامي كه برنامه هاي كاربردي به زبان جاوا توسعه پيدا مي كنند، صدها كلاس ها و رابط نوشته خواهند شد، بنابراين طبقه بندي اين كلاس¬ها اجباري است و همچنين باعث بقاي بسيار ساده تر برنامه مي شود.

تعريف Import :

در جاوا اگر يك نام كامل، شامل بسته و نام كلاس، داده شده باشد، كامپايلر به راحتي مي توانيد كد منبع و يا كلاس را مكان يابي كند. Import statement راهي براي مشخص كردن موقعيت مناسب براي كامپايلر براي پيدا كردن كلاس خاص است.
به عنوان مثال، خط زير از كامپايلر مي خواهد تا تمام كلاس هاي موجود در دايركتور java_installation/java/io را بارگذاري نمايد.

1
import 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;
     
   // This is the constructor of the class Employee
   public Employee(String name){
      this.name = name;
   }
   // Assign the age of the Employee  to the variable age.
   public void empAge(int empAge){
      age =  empAge;
   }
   /* Assign the designation to the variable designation.*/
   public void empDesignation(String empDesig){
      designation = empDesig;
   }
   /* Assign the salary to the variable salary.*/
   public void empSalary(double empSalary){
      salary = empSalary;
   }
   /* Print the Employee details */
   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[]){
      /* Create two objects using constructor */
      Employee empOne = new Employee("James Smith");
      Employee empTwo = new Employee("Mary Anne");
 
      // Invoking methods for each object created
      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
 
امتیاز:
 
بازدید:
[ ۴ مرداد ۱۳۹۵ ] [ ۰۸:۴۳:۲۴ ] [ الهام كشاورز ] [ نظرات (0) ]
{COMMENTS}
ارسال نظر
نام :
ایمیل :
سایت :
آواتار :
پیام :
خصوصی :
کد امنیتی :
.: Weblog Themes By ratablog :.

درباره وبلاگ

با سلام خدمت دوستان عزيز اميدوارم كه از مطالبي كه در اين وبلاگ منتشر ميكنم راضي باشيد لطفا نظراتتون رو بگيد موفق باشيد دوستان
نويسندگان
مطالب تصادفی
لینک های تبادلی
فاقد لینک
تبادل لینک اتوماتیک
لینک :
خبرنامه
عضویت   لغو عضویت
پنل کاربری
نام کاربری :
پسورد :
عضویت
نام کاربری :
پسورد :
تکرار پسورد:
ایمیل :
نام اصلی :
آمار
امروز : 2
دیروز : 8
افراد آنلاین : 2
همه : 1605
چت باکس
موضوعات وب
موضوعي ثبت نشده است
امکانات وب