آموزش زبان جاوا به زبان ساده – شی و کلاس ها در جاوا

دسته بندی ها : آموزش زبان جاوا, مقالات آموزشی 16 آبان 1398 سورس آباد

شی گرایی در جاوا

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

  • Polymorphism (چند ریختی)
  • Inheritance (وراثت)
  • Encapsulation (کپسوله سازی)
  • Abstraction (انتزاع، برداشت)
  • Classes (کلاس ها در جاوا)
  • Objects (اشیا)
  • Instance (نمونه)
  • Method (متد یا همان توابع)
  • Message Passing (ارسال پیام)

در این آموزش به بررسی مفاهیم، کلاس ها در جاوا، اشیاء و قابلیت شی گرایی در جاوا می پردازیم.

  • شیء (Object): اشیاء (Objects) حالت ها و رفتارهایی دارند. مثال: لباس یک شیء است که دارای ویژگی های اندازه، قیمت، کیفیت، نوع بافت، دوخت و … است. یک شیء نمونه ای ( Instance ) از یک کلاس است. بگذارید کمی با این واژه آشنا شویم. قابلیت شی گرایی در جاوا به گونه ای است که ما میتوانیم المان های مورد نیاز خود برای ساخت یک برنامه را یک شیء در نظر بگیریم. به عنوان مثال، ما میخواهیم یک برنامه مدیریتی فروش در یک فروشگاه لوازم الکتریکی را ایجاد کنیم. فرض کنید کارفرما از ما برنامه ای درخواست کرده که لیستی از گوشی های هوشمند، همراه با اطلاعات مربوط به هرکدام و همچنین لیستی از خریداران این اجناس را به ما نمایش دهد. خب، ما در اینجا دو المان مورد نیاز میبینیم، یکی گوشی و دیگری شخص خریدار.
    اینجاست که قابلیت شی گرایی در جاوا به کمک برنامه نویس می آید و سهولت در کار را افزایش میدهد.
    در اینجا گوشی و خریدار را دو شیء در نظر میگیریم و برای هرکدام یک کلاس تعریف میکنیم. به عنوان مثال گوشی دارای ویژگی های اندازه صفحه نمایش، قیمت، کیفیت دوربین، نوع و … است و همچنین شخص خریدار دارای ویژگی های نام و نام خانوادگی، شماره حساب، کد ملی و … است.
    که تمامی این ویژگی ها در کلاس مربوط به هر شئ تعریف خواهند شد.
  • کلاس (Class): یک کلاس را می توان به عنوان یک الگو تعریف کرد که رفتار و وضعیتی را که شیء دارا میباشد، در این کلاس ها تعریف میشود. همانند مثال بالا که گفته شد. همچنین در این کلاس ها متدهای (توابع) مربوط به هر شیء در کلاس مورد نظر تعریف میشود. در آموزش های بعدی بیشتر درباره کلاس ها، شی گرایی و راوبط میان آن ها صحبت خواهیم کرد.

اشیا در جاوا

بگذارید اکنون با نگاهی باز تر به قابلیت شی گرایی بپردازیم. اگر دنیای واقعی را در نظر بگیریم، می توانیم اشیاء زیادی را در اطراف خود بیابیم، اتومبیل، سگ، انسان و غیره. همه این ها اشیاء محسوب میشوند و حالت و رفتارهای مختص به خود را دارا میباشند.

اگر یک سگ را در نظر بگیریم، حالت (state) آن، نام، نژاد، رنگ و … است و رفتار آن ( behavior ) – پارس کردن، دمیدن دم، دویدن و غیره است.

اگر شیء مربوط به یک نرم افزار را با یک شیء در دنیای واقعی مقایسه کنید، آنها مشخصات بسیار مشابه ی را خواهند داشت.

اشیاء در جاوا دارای حالت (state) و رفتار (behavior) هستند. حالت یک شیء نرم افزاری در فیلد ها (field) ذخیره می شود و رفتار از طریق متدها (توابع) نشان داده می شود.

بنابراین در توسعه نرم افزار، توابع بر روی حالت داخلی یک شی کار می کنند و ارتباط شی – با شیء با استفاده از توابع انجام می شود.

کلاس ها در زبان جاوا

به طور کلی در بحث شی گرایی در جاوا، کلاس یک طرح است که از آن اشیاء جداگانه ساخته می شود.

در ادامه نمونه ای از یک کلاس آمده است :

مثال :

 public class Dog { 
  String breed; 
 int age; 
 String color; 

  void barking() { 
   } 
  
 void hungry() { 
   } 

  void sleeping() { 
    } 
 } 

خب همانطور که در بالا میبینید یک کلاس با نام سگ ایجاد شده و حالت های (state) آن از قبیل نژاد، سن و رنگ قرار داده شده و همچینین هرکدام از رفتارهای (behavior) آن در قالب یک متد در کلاس تعریف شده است، مثل پارس کردن، گرسنه بودن و خوابیدن.

یک کلاس می تواند شامل هر یک از انواع متغیر زیر باشد.

  • Local variables (متغیرهای محلی): متغیرهای تعریف شده در متدها (توابع)، سازنده ها یا بلوک هایی هستند که متغیرهای محلی نامیده می شوند. به این صورت که متغیر مربوط به تابع مورد نظر ما توسط برنامه صدا زده شده و بعد از جایگذاری در تابع کار ما با آن متغیر به اتمام میرسد.
  • Instance variables (متغیرهای نمونه): متغیرهای نمونه متغیرهای درون یک کلاس هستند اما خارج از هر تابع. این متغیرها هنگام شروع کلاس شروع می شوند. به متغیرهای نمونه از هر تابع، سازنده یا بلوکی از آن کلاس خاص، می توان دسترسی داشت. به طور کلی Instance یعنی ساخت یک شیء از یک کلاس. به عنوان مثال ما میتوانیم از کلاس سگ که شیء سگ و حالت ها و رفتارهایش تعریف شده است یه نمونه ایجاد کنیم و به آن نام اختصاص دهیم. ازیک شئ موجود دریک کلاس میتوان چندین نمونه ساخت.
  • Class variables (متغیرهای کلاس): متغیرهای کلاس، متغیرهای اعلام شده در داخل یک کلاس هستند، خارج از هر متد (تابع)، با کلمه کلیدی استاتیک.

یک کلاس می تواند هر تعداد تابع برای دسترسی به ارزش انواع مختلف توابع را داشته باشد. در مثال فوق، پارس کردن ()، گرسنگی () و خواب () تابع هستند.

موارد ذکر شده برخی از مباحث مهمی که باید هنگام جستجو در کلاس های زبان جاوا مورد بحث قرار گیرد.

سازنده ها در جاوا Constructors

هنگام بحث در مورد کلاس ها در جاوا، یکی از مهم ترین موضوعات اصلی سازنده ها (Constructors) هستند. هر کلاس دارای یک سازنده است. اگر صریحاً یک سازنده برای یک کلاس ننویسیم، کامپایلر جاوا یک سازنده پیش فرض برای آن کلاس ایجاد می کند.

هر بار که یک شی جدید ایجاد شود، حداقل یک سازنده فراخوانی می شود. قانون اصلی سازندها این است که آنها باید نامی مشابه کلاس داشته باشند. یک کلاس می تواند بیش از یک سازنده داشته باشد.

در زیر مثالی از یک سازنده (Constructor) آمده است:

 public class Puppy { 
  public Puppy() { 
 } 

 public Puppy(String name) { 
 // This constructor has one parameter, name. 
   } 
 } 

جاوا همچنین از کلاس های Singleton پشتیبانی می کند که می توانید فقط یک نمونه از آن کلاس ایجاد کنید.

توجه: ما دو نوع سازنده مختلف داریم. ما در آموزش های بعدی قصد داریم به طور مفصل در مورد سازندگان بحث کنیم.

ساخت یک شیء در جاوا

همانطور که قبلاً ذکر شد، یک کلاس الگو های اشیاء را فراهم می کند. بنابراین اساس، یک شی از یک کلاس ایجاد می شود. در جاوا از کلمات کلیدی جدید برای ایجاد اشیاء جدید استفاده می شود.

برای ایجاد یک شی از یک کلاس سه مرحله را باید طی کرد:

  • Declaration (اعلام): اعلام یک بیانیه متغیر با یک نام متغیر همراه با نوع شیء.
  • Instantiation (معرفی): از کلمه کلیدی New برای ایجاد شی استفاده می شود.
  • Initialization (مقدار دهی): کلمه کلیدی New تماس با سازنده کلاس مربوطه را به همراه دارد. این تماس شی جدید را تولید می کند.

در زیر مثالی ازساخت یک شیء آمده است:

 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 

دسترسی به متغیرهای نمونه و متدها

متغیر های نمونه و متدها (توابع) از طریق اشیاء ایجاد شده قابل دسترس هستند.

 /* 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(); 

مثال:

این مثال نحوه دستیابی به متغیرهای نمونه و متدهای یک کلاس را توضیح می دهد.

 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 

در کلاس puppy شما دو متد با نام های GetAge و SetAge را مشاهده میکنید که به آن ها اصطلاحاGetter , Setter نیز گفته میشود. وظیفه متد Set، مقداردادن است و وظیفه Get، نمایش آن مقدار است. به عنوان مثال در قطعه کد بالا، در ابتدا یک نمونه از شی خودمان را که در اینجا سگ باشد را ایجاد میکنیم و سپس سن آن را با فراخواندن متد SetAge، به مقدار 2 قرار میدهیم. در خط بعدی متد GetAge، را فرا میخوانیم تا مقداری که قرار داده ایم برای ما قابل نمایش باشد. به طور ساده تر ما با Set، مقدار را وارد میکنیم و با Get، آن مقدار را دریافت میکنیم.

قوانین اعلام فایل منبع

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

  • در هر پرونده منبع (Source File) فقط یک کلاس عمومی وجود دارد.
  • یک پرونده منبع (Source File) می تواند چندین کلاس غیر عمومی داشته باشد.
  • نام کلاس عمومی باید نام فایل منبع باشد و باید در پایان آن .java اضافه شود. به عنوان مثال: نام کلاس کلاس عمومی Employee{} است، بنابراین پرونده منبع باید به صورت Employee.java باشد.
  • اگر کلاس در داخل یک پکیج تعریف شده باشد، گزاره (statement) بسته باید اولین جمله در پرونده منبع باشد.
  • اگر گزاره وارد شده وجود داشته باشد، باید بین گزاره بسته (package statement) و اعلامیه کلاس (class declaration) نوشته شود. اگر هیچ گزاره بسته ای وجود نداشته باشد، باید گزاره های وارده در اولین خط پرونده منبع باشد.
  • گزاره های وارد شده وپکیج، به کلیه کلاس های موجود در پرونده منبع دلالت خواهد داشت. اعلان کردن این مقادیر وارد شده و یا گزاره بسته های مختلف برای کلاس های مختلف در پرونده منبع امکان پذیر نیست.

کلاس ها در جاوا چندین سطح دسترسی دارند و انواع مختلفی از کلاس ها وجود دارد. کلاس های انتزاعی (abstract classes)، کلاس های پایانی (final classes) و غیره. در مورد همه اینها در فصل سطح دسترسی اصلاح کنندگان (access modifiers) توضیح خواهیم داد.

جدای از کلاس های ذکر شده در بالا، جاوا همچنین دارای کلاس های خاصی به نام کلاس های داخلی و کلاس های ناشناس است.

بسته بندی جاوا Java Package

به زبان ساده، روشی برای طبقه بندی کلاس ها در جاوا و رابط ها (interfaces) است. هنگام توسعه برنامه های کاربردی در جاوا، صدها کلاس و واسطه نوشته خواهد شد، بنابراین طبقه بندی این کلاس ها یک امر ضروری است و همچنین کار را بسیار آسان تر می کند.

بیانیه های وارده Import Statements

در جاوا اگر نام کامل واجد شرایطی وجود داشته باشد که شامل بسته و نام کلاس باشد، آنگاه کامپایلر می تواند به راحتی کد منبع یا کلاس ها را پیدا کند. Import Statements راهی برای دادن آدرس مناسب به کامپایلر برای یافتن آن کلاس خاص است.

به عنوان مثال، خط زیر، از کامپایلر می خواهد تا تمام کلاسهای موجود در فهرست را بارگیری کند.
java_installation/java/io −

 import java.io.*; 

بررسی موردی ساده Simple Case Study

برای مطالعه موردی ما (Case Study)، دو کلاس ایجاد خواهیم کرد. آنها Employee و EmployeeTest هستند.

ابتدا NotePad را باز کرده و کد زیر را اضافه کنید. به یاد داشته باشید این کلاس Employee است و کلاس یک کلاس عمومی است. اکنون، این فایل منبع را با نام Employee.java ذخیره کنید.

کلاس Employee دارای چهار متغیر نمونه – نام، سن، تخصص و حقوق است. کلاس دارای یک سازنده مشخص است که یک پارامتر را می گیرد.

مثال:

 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 ذخیره کنید.

 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 

Eclipse: یک Java IDE بسیار محبوب که می توانید از اینجا دانلود کنید.

مشاهده دیگر آموزش های زبان برنامه نویسی جاوا در سورس آباد

سورس آباد
سورس آباد

مدیر وبسایت سورس آباد، علاقه‌مند به دنیای وب، اندروید و بازاریابی اینترنتی که دوست دارم تجربیاتم رو با دیگران به اشتراک بگذارم.

راه آسان‌تری برای ارتباط با کاربران‌مان پیدا کرده‌ایم :) عضویت در کانال

نظرات کاربران

    متاسفیم! برای ثبت دیدگاه باید وارد شوید!

    لینک کوتاه :

    عضویت در خبرنامه ویژه مشتریان سیگما پلاس

    با عضویت در خبرنامه ویژه سیگما پلاس از آخرین جشنواره های سایت باخبر شوید!