مشخصات مقاله
-
3161
-
0.0
-
19519
-
0
-
0
آموزش تابع سازنده یا Constructor در Java
آموزش Java – تابع سازنده یا Constructor در Java
Constructor یا تابع سازنده در زبان Java یک متد خاص است که برای مقداردهی اولیه ی فیلدهای کلاس و پرکردن آّبجکت با داده بکار می رود.
تابع constructor در زمان ایجاد آبجکت فراخوانی می شود. این تابع در واقع مقادیر را ساخته، فیلدهای کلاس را مقداردهی می کند و آبجکت ساخته شده از روی کلاس را با داده پر می نماید.
قواعد و استانداردهای تعریف تابع Constructor در Java
دو قاعده یا استاندارد وجود دارد که برای تعریف constructor باید از آن ها پیروی کرد:
- اسم constructor باید با اسم کلاس یکسان باشد.
- تابع constructor نباید هیچ نوع خروجی (مقدار بازگشتی) صریحی داشته باشد.
در کل دو نوع تابع سازنده وجود دارد که در زیر به آن ها اشاره می کنیم:
- تابع سازنده ی پیش فرض (no-arg constructor که پارامتری ندارد)
- تابع سازنده ی پارامتر دار (Parameterized constructor)
![آموزش Java آموزش Java]()
تابع سازنده ی پیش فرض Java
تابع سازنده ای که هیچ پارامتری نداشته باشد تحت عنوان constructor پیش فرض شناخته می شود.
دستور تعریف تابع سازنده ی پیش فرض:
< class_name >(){}
مثال کاربردی از تابع سازنده ی پیش فرض
در مثال حاضر قصد داریم که یک تابع سازنده ی بدون پارامتر (no-args) در کلاس Bike ایجاد کنیم. این تابع سازنده در زمان ساخت آبجکت از روی کلاس فراخوانی می شود.
class Bike1{
Bike1(){System.out.println("Bike is created");}
public static void main(String args[]){
Bike1 b=new Bike1();
}
}
خروجی:
Bike is created
اگر تابع سازنده ای در یک کلاس وجود نداشته باشد، کامپایلر به صورت خودکار یک constructor پیش فرض ایجاد می نماید.
هدف از ساخت تابع سازنده ی پیش فرض چیست؟
Default constructor در واقع متغیرهای تعریف شده در بدنه ی کلاس میزبان را صدا می زند و آن ها را بر اساس نوع داده ای اولیه ی هریک، مقداردهی اولیه می کند. سازنده ی پیش فرض را دستگاه مجازی جاوا به صورت خودکار صدا زده و فیلدهای کلاس را مقداردهی اولیه می کند.
مثال کاربردی از استفاده از تابع سازنده ی پیش فرض که مقادیر پیش فرض را نمایش می دهد
class Student3{
int id;
String name;
void display(){System.out.println(id+" "+name);}
public static void main(String args[]){
Student3 s1=new Student3();
Student3 s2=new Student3();
s1.display();
s2.display();
}
}
خروجی:
0 null 0 null
شرح: در کلاس بالا، شما هیچ تابع سازنده ای تعریف نکرده اید، بنابراین خود کامپایلر دستگاه مجازی Java یک constructor پیش فرض برای شما فراخوانی می کند. مقادیر 0 و null که در خروجی مشاهده می کنید، مقادیر دو متغیر تعریف شده در کلاس Student3 هستند که تابع سازنده ی پیش فرض آن ها را (بر اساس نوع داده ای اولیه هر متغیر) فراهم می کند.
تابع سازنده ی پارامتر دار (parameterized constructor) در Java
یک تابع سازنده که پارامتر دارد، تحت عنوان parameterized constructor یا سازنده ی پارامتردهی شده شناخته می شود.
دلیل استفاده از تابع سازنده ی پارامتردهی شده
این نوع تابع سازنده برای ارائه ی مقادیر مختلف به آبجکت های متمایز (مختلف) بکار می رود.
مثال کاربردی از تابع سازنده ی پارامتردهی شده
در مثال پیشرو، می بینید که یک تابع سازنده از کلاس Student ایجاد کرده ایم که دو پارامتر ورودی دریافت می کند. البته در صورت تمایل می توان n تا پارامتر به عنوان ورودی به تابع سازنده ی پیش فرض پاس داد.
class Student4{
int id;
String name;
Student4(int i,String n){
id = i;
name = n;
}
void display(){System.out.println(id+" "+name);}
public static void main(String args[]){
Student4 s1 = new Student4(111,"Karan");
Student4 s2 = new Student4(222,"Aryan");
s1.display();
s2.display();
}
}
خروجی:
111 Karan 222 Aryan
فراخوانی تابع سازنده با پارامترهای مختلف (Constructor overloading)
Constructor overloading یک تکنیک در زبان برنامه نویسی جاوا است که کلاس می تواند چندین تابع سازنده با پارامترهای ورودی مختلف داشته باشد. کامپایلر با درنظر گرفتن تعداد و نوع پارامترهای ورودی توابع سازنده بین آن ها تمایز قائل می شود.
مثال کاربردی از فراخوانی تابع سازنده با پارامترهای ورودی مختلف/ Constructor overloading
class Student5{
int id;
String name;
int age;
Student5(int i,String n){
id = i;
name = n;
}
Student5(int i,String n,int a){
id = i;
name = n;
age=a;
}
void display(){System.out.println(id+" "+name+" "+age);}
public static void main(String args[]){
Student5 s1 = new Student5(111,"Karan");
Student5 s2 = new Student5(222,"Aryan",25);
s1.display();
s2.display();
}
}
خروجی:
111 Karan 0 222 Aryan 25
شرح تفاوت های بین تابع سازنده و متد در Java
تفاوت های زیادی بین توابع سازنده و متد در جاوا وجود دارد که در زیر شرح خواهیم داد:
تابع سازنده جهت کپی اطلاعات یک شی به داخل کلاس در زمان ساخته شدن (Copy Constructor)
بر خلاف C++، در زبان Java امکانی به نام copy constructor وجود ندارد. با این حال شما می توانید همین عملیات را با روش دیگر پیاده سازی کنید. در واقع شما می توانید مقادیر یک آّبجکت را داخل آبجکت دیگری پس از کپی، جایگذاری نمایید.
روش های مختلفی برای کپی کردن مقادیر یک آبجکت در آبجکت دیگری در Java وجود دارد که در زیر آن ها را لیست می کنیم.
- به وسیله ی constructor یا تابع سازنده
- با تخصیص مقادیر یک آبجکت در آبجکت دیگر
- به وسیله ی متد clone() از کلاس Object
در مثال جاری، قصد داریم تا مقادیر یک آبجکت را به وسیله ی تابع سازنده ی Java در آبجکت دیگری کپی و جایگذاری کنیم.
class Student6{
int id;
String name;
Student6(int i,String n){
id = i;
name = n;
}
Student6(Student6 s){
id = s.id;
name =s.name;
}
void display(){System.out.println(id+" "+name);}
public static void main(String args[]){
Student6 s1 = new Student6(111,"Karan");
Student6 s2 = new Student6(s1);
s1.display();
s2.display();
}
}
خروجی:
111 Karan 111 Karan
کپی مقادیر بدون کمک تابع سازنده
می توانیم مقادیر یک آبجکت را در آبجکت دیگر جایگذاری کرد. کافی است مقادیر آبجکت ها را به آبجکت دیگر تخصیص دهید. در این روش نیازی به ساخت و استفاده از تابع سازنده نیست.
class Student7{
int id;
String name;
Student7(int i,String n){
id = i;
name = n;
}
Student7(){}
void display(){System.out.println(id+" "+name);}
public static void main(String args[]){
Student7 s1 = new Student7(111,"Karan");
Student7 s2 = new Student7();
s2.id=s1.id;
s2.name=s1.name;
s1.display();
s2.display();
}
}
خروجی:
111 Karan 111 Karan
آیا تابع سازنده مقداری را برمی گرداند؟
در پاسخ باید گفت که بلی. مقدار بازگشتی تابع سازنده نمونه ی کلاس جاری است (لازم به ذکر است که در تعریف constructor شما هیچ نوع بازگشتی (return type) برای مقدار مشخص نمی کنید. با این حال سازنده نیز خروجی دارد و آن نمونه ی کلاس جاری است).
آیا تابع سازنده به غیر از مقداردهی اولیه آبجکت کار دیگری هم انجام می دهد؟
در پاسخ باید گفت بلی. از جمله ی کارهایی که قادر به انجام آن است می توان به ساخت آبجکت، راه اندازی یک thread، فراخونی متد و غیره ... اشاره کرد. می توان هر عملیاتی که داخل بدنه ی یک متد متعارف انجام می دهید، در Constructor نیز پیاده سازی کنید.
