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

  • چند ریختی یا Polymorphism
  • وراثت یا Inheritance
  • کپسوله سازی یا Encapsulation
  • انتزاع یا Abstraction
  • کلاس ها یا classes
  • اشیاء یا objects
  • نمونه گیری یا Instance
  • متد یا method
  • Message Parsing

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

  • شیء(object): اشیاء دارای رفتار و حالت می باشند. مثال: یک گرگ دارای حالت های: رنگ و نام  و نژاد می باشد و دارای رفتارهایی مثل: روژه کشیدن و غذا خوردن و ... می باشد. یک شیء درواقع یک نمونه از یک کلاس است. 
  • کلاس(class): یک کلاس می تواند بعنوان یک قالب تعریف شود که از رفتار یا حالت های شیء  پشتیبانی می کند.

اکنون اجازه دهید تا به طور عمیق تر به این موضوع بپردازیم که اشیاء چه هستند. اگر که ما دنیای واقعی را در نظر بگیریم، می توانیم اشیای زیادی را در پیرامون خود مشاهده کنیم مانند: ماشین ها و گرگ ها و انسان ها و ... . تمام این اشیاء دارای یک سری حالت(خصوصیت) و رفتار هستند. 

اگر که یک گرگ را در نظر بگیریم، حالت های(خصوصیت ها) آن عبارتند از : نام و نژاد و رنگ  و رفتارهای آن عبارتند از: روژه کشیدن و غذا خوردن و دویدن. 

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

اشیای نرم افزاری نیز دارای حالت(خصوصیت) و رفتار هستند. یک حالت(خصوصیت) در یک نرم افزار در رشته ها(fields) ذخیره می شود و یک رفتار در قالب متدها تبلور می یابد. 

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

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

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

یک کلاس ساده مانند زیر می باشد:

کد

public class Dog{
String breed;
int ageC
String color;
void barking(){
}

void hungry(){
}

void sleeping(){
}
}

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

  • متغیرهای محلی: متغیرهای تعریف شده در متدها و سازنده ها و یا بلوک ها، متغیرهای محلی نامیده می شوند. متغیر ذکر شده می تواند در داخل متدها و فراخوانی و مقداردهی اولیه شود و این متغیر هنگامی که متد کامل شود، از بین خواهد رفت. 
  • متغیرهای نمونه: متغیرهای نمونه، متغیرهایی هستند که در داخل یک کلاس قرار دارنداما درون هیچ متدی قرار ندارند. این متغیر ها، هنگامی که از کلاس مورد نظر نمونه گیری شود، مقداردهی اولیه خواهند شد. متغیرهای نمونه می توانند در داخل هر متد یا سازنده یا بلوک از آن کلاس خاص، مورد دسترسی قرار بگیرند. 
  • متغیرهای کلاس: متغیرهای کلاس، به متغیر هایی گفته می شود که در داخل یک کلاس تعریف شده اند و درون هیچ متدی نمی باشند و دارای کلمه ی کلیدی static می باشند.

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

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

سازنده ها  یا constructors

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

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

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

کد

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

 جاوا همچنین از کلاس های یگانه(singleton)  پشتیبانی می کند. کلاس یگانه به این معنی است که شما تنها می توانید یک نمونه از آن کلاس ایجاد کنید. 

نکته: ما درواقع دو نوع سازنده(constructor) داریم که در مقالات بعدی بیشتر به جزئیات مربوط به آنها خواهیم پرداخت. 

 ایجاد یک شیء 

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

برای ایجاد یک شیء از یک کلاس، سه گام وجود دارند که باید انجام دهیم: 

  • شناساندن(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" );
}
}

 اگر که ما کد بالا را کامپایل و اجرا کنیم، نتیجه ی زیر ظاهر خواهد شد: 

کد

PassedNameis:tommy

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

متغیرهای نمونه و متدها می توانند به وسیله ی اشیای ایجاد شده، مورد دسترسی قرار بگیرند. برای دسترسی به یک متغیر نمونه، به صورت زیر عمل می کنیم: 

کد

/* ابتدا یک شیء ایجاد کنید */
ObjectReference = new Constructor();
/* اکنون می توانید یک متغیر را فراخوانی کنید */
ObjectReference.variableName;
/* اکنون می توانید یک متد کلاس را فراخوانی کنید */
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

 قواعد تعریف فایل منبع

اجازه دهید تا در این قسمت از آموزش، به قواعد تعریف فایل منبع نگاهی بیاندازیم. هنگام تعریف کلاس ها و دستورات import و دستورات package در یک فایل منبع(source file)، این قواعد ضروری هستند:

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

کلاس ها دارای چندین سطح دسترسی هستند و انواع مختلفی از کلاس ها نیز وجود دارند. مانند: کلاس های abstract و ;کلاس های final و ... . در مقالات بعدی در مورد این کلاس ها کاملا بحث خواهد شد. 

به غیر از انواع کلاس های ذکر شده در بالا، جاوا دارای کلاس های ویژه ای به نام کلاس های درونی(inner classes) و کلاس های بی نام(anonymous classes) می باشد. 

پکیج ها در جاوا

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

دستورات Import

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

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

کد

import java.io.*;

بررسی اجمالی

در این بررسی اجمالی، قصد داریم دو کلاس را ایجاد کنیم. نام آن دو کلاس عبارت است از: Employee و EmployeeTest. 

ابتدا نوتپد(یا ادیتور مورد نظر خود) را باز کنید و کد زیر را در آن قرار دهید. به خاطر داشته باشید که نام این کلاس Employee می باشد و همچنین این کلاس از نوع public است. حالا این فایل منبع را با نام Employee.java ذخیره کنید. 

کلاس Employee دارای چهار متغیر نمونه می باشد به نام های: name و age و designation و salary. این کلاس دارای یک  سازنده(constructor) می باشد که یک پارامتر را می گیرد. 

Title

import java.io.*;
public class Employee{
String name;
int age;
String designation;
double salary;

//می باشد Employeeاین همان سازنده ی مربوط به کلاس
public Employee(String name){
this.name = name;
}
//ageدر متغیر Employeeاز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 شروع می شود. بنابراین برای اینکه بتوانیم این کلاس را اجرا کنیم، باید متد main را به همراه اشیاء مورد نظر ایجاد کنیم. برای انجام این کار بایستی یک کلاس جداگانه را تعریف کنیم. 

آنچه در زیر می بینید، کلاس 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

 آنچه خواهید آموخت...

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