شنبه ۲۹ دي ۱۴۰۳
Tut24 آموزش برنامه نویسی و مجله تخصصی فناوری ورود/عضویت

آموزش جاوا - اشیاء و کلاس

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

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

در این فصل، به بررسی مفاهیم ،کلاس‌ها و اشیا می‌پردازیم.

  • شیء (Object) − اشیا وضعیت‌ها و رفتارهایی دارند. مثال: یک سگ وضعیت‌هایی مانند رنگ، نام، نژاد و رفتارهایی مانند تکان دادن دم، واقع و خوردن دارد. یک شیء نمونه‌ای از یک کلاس است.

  • کلاس (Class) − یک کلاس می‌تواند به عنوان یک قالب/طرح مشخص کننده رفتار/وضعیتی که شیء‌های از نوع آن پشتیبانی می‌کنند، تعریف شود.

اشیا در جاوا

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

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

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

اشیاء نرم‌افزاری همچنین وضعیت و رفتاری دارند. وضعیت یک شیء نرم‌افزاری در فیلدها ذخیره می‌شود و رفتار آن از طریق متدها نمایش داده می‌شود.

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

کلاس‌ها در جاوا

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

مثال زیر نمونه‌ای از یک کلاس است.

مثال


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

   void barking() {
   }

   void hungry() {
   }

   void sleeping() {
   }
}

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

  • متغیرهای محلی (Local variables) − متغیرهایی که در داخل متدها، سازنده‌ها یا بلوک‌ها تعریف می‌شوند، متغیرهای محلی نامیده می‌شوند. این متغیرها در داخل متد تعریف و مقداردهی می‌شوند و وقتی متد به پایان می‌رسد، متغیر از بین می‌رود.

  • متغیرهای نمونه (Instance variables) − متغیرهای نمونه در داخل یک کلاس ولی خارج از هر متد قرار می‌گیرند. این متغیرها در زمان نمونه‌سازی کلاس مقداردهی اولیه می‌شوند. متغیرهای نمونه از داخل هر متد، سازنده یا بلوک مربوط به آن کلاس قابل دسترسی هستند.

  • متغیرهای کلاس (Class variables) − متغیرهای کلاس در داخل یک کلاس ولی خارج از هر متد با استفاده از کلیدواژه static تعریف می‌شوند.

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

موضوعات مهمی که باید در بررسی کلاس‌های زبان جاوا مورد بحث قرار گیرند، عبارتند از:

سازنده‌ها (Constructors)

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

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

مثال زیر یک سازنده را نمایش می‌دهد −

مثال


public class Puppy {
   public Puppy() {
   }

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

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

  • متغیرهای محلی (Local variables) − متغیرهایی که در داخل متدها، سازنده‌ها یا بلوک‌ها تعریف می‌شوند، متغیرهای محلی نامیده می‌شوند. این متغیرها در داخل متد تعریف و مقداردهی می‌شوند و وقتی متد به پایان می‌رسد، متغیر از بین می‌رود.

  • متغیرهای نمونه (Instance variables) − متغیرهای نمونه در داخل یک کلاس ولی خارج از هر متد قرار می‌گیرند. این متغیرها در زمان نمونه‌سازی کلاس مقداردهی اولیه می‌شوند. متغیرهای نمونه از داخل هر متد، سازنده یا بلوک مربوط به آن کلاس قابل دسترسی هستند.

  • متغیرهای کلاس (Class variables) − متغیرهای کلاس در داخل یک کلاس ولی خارج از هر متد با استفاده از کلیدواژه static تعریف می‌شوند.

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

موضوعات مهمی که باید در بررسی کلاس‌های زبان جاوا مورد بحث قرار گیرند، عبارتند از:

سازنده‌ها (Constructors)

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

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

مثال زیر یک سازنده را نمایش می‌دهد −

مثال


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 Variables and Methods)

متغیرها و متدهای نمونه از طریق اشیاء ساخته شده قابل دسترسی هستند. برای دسترسی به یک متغیر نمونه، مسیر کامل کیفیت زیر است 

 


/* 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

قوانین اعلان فایل منبع (Source File Declaration Rules)

به عنوان بخش آخر این بخش، حالا به قوانین اعلان فایل منبع نگاه می‌کنیم. این قوانین بسیار حائز اهمیت هستند هنگام اعلان کلاس‌ها، دستورات import و دستورات package در یک فایل منبع.

  • تنها می‌توان یک کلاس عمومی در هر فایل منبع داشت.

  • یک فایل منبع می‌تواند شامل چند کلاس غیرعمومی باشد.

  • نام کلاس عمومی باید همان نام فایل منبع باشد و در پایان باید با .java اضافه شود. به عنوان مثال: نام کلاس public class Employee{} است، پس فایل منبع باید به صورت Employee.java باشد.

  • اگر کلاس درون یک بسته (package) تعریف شده باشد، دستور package باید اولین دستور در فایل منبع باشد.

  • اگر دستورات import وجود داشته باشند، آنها باید بین دستور package و اعلان کلاس نوشته شوند. اگر دستورات package وجود نداشته باشند، دستور import باید در خط اول فایل منبع نوشته شود.

  • دستورات import و package برای تمام کلاس‌های موجود در فایل منبع اعمال می‌شوند. امکان داشتن دستورات import و/یا package متفاوت برای کلاس‌های مختلف در فایل منبع وجود ندارد.

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

علاوه بر انواع کلاس‌های ذکر شده، جاوا نیز برخی کلاس‌های ویژه به نام کلاس‌های داخلی (Inner classes) و کلاس‌های ناشناس (Anonymous classes) دارد.

بسته جاوا (Java Package)

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

دستورات Import

در جاوا، اگر یک نام کامل (fully qualified name)، که شامل بسته و نام کلاس است، داده شود، کامپایلر به راحتی می‌تواند مکان کد منبع یا کلاس را پیدا کند. دستور import روشی است برای اعلام مکان مناسب برای کامپایلر برای پیدا کردن آن کلاس خاص.

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

 


import java.io.*;

یک مورد مطالعه ساده

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

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

کلاس Employee دارای چهار متغیر نمونه (instance variables) به نام‌های name، age، designation و salary است. این کلاس یک سازنده به صورت صریح تعریف شده است که یک پارامتر را دریافت می‌کند.

مثال


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);
   }
}

همانطور که پیشتر در این آموزش اشاره شد، پردازش از متد اصلی (main method) شروع می‌شود. بنابراین برای اجرای این کلاس 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