logo logo
خوش آمدید! برای فعال سازی امکانات لطفا ورود یا ثبت نام.

توجه

Icon
Error

آموزش برنامه نویسی جاوا – قسمت ششم – شی گرایی در جاوا
developzoom
#1 ارسال شده : سه شنبه، 09 اوت 2016 08:26:23 ب.ظ(UTC)
developzoom

رتبه: Member

گروه ها: Registered
تاریخ عضویت: 20/04/2016(UTC)
ارسالها: 20
IRAN (ISLAMIC REPUBLIC OF)
مکان: ایران

شی ها و کلاس ها در جاوا

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

چند ریختی
وراثت
کپسوله سازی
انتزاع – مفهوم – برداشت
کلاس ها
اشیاء
نمونه
متد
پیام تجزیه
در این در قسمت از آموزش جاوا، به مفاهیم کلاس و اشیاء نگاهی خواهیم کرد.
شی: اشیاء یکسری خصوصیات (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
کاربرانی که در حال مشاهده انجمن هستند
Guest
جهش به انجمن  
شما مجاز به ارسال مطلب در این انجمن نمی باشید.
شما مجاز به ارسال پاسخ در این انجمن نمی باشید.
شما مجاز به حذف مطلب ارسالی خود در این انجمن نمی باشید.
شما مجاز به ویرایش مطلب ارسالی خود در این انجمن نمی باشید.
شما مجاز به ایجاد نظر سنجی در این انجمن نمی باشید.
شما مجاز به رای دادن در این انجمن نمی باشید.