در این آموزش با سازنده ها در جاوا آشنا می شوید؛ نحوه ایجاد و استفاده از سازنده ها با کمک مثال.
سازنده چیست؟
سازنده (constructor) شبیه به متد است (اما در واقع متد نیست) که هنگام ایجاد شی فورا به صورت خودکار فراخوانی می شود.
کامپایلر جاوا با استفاده از نام و نوع بازگشتی بین متد و سازنده تفاوت قائل می شود. در جاوا ، سازنده نامی مشابه کلاس دارد و هیچ مقداری را بر نمی گرداند.
class Test {
Test() {
// constructor body
}
}
در اینجا ، ()Test سازنده است. همان نام کلاس را دارد و نوع برگشتی ندارد.
class Test {
void Test() {
// method body
}
}
در اینجا ، ()Test نامی مشابه کلاس دارد. با این حال ، نوع برگشتی آن void است. از این رو ، سازنده نیست و متد است.
مثال: سازنده در جاوا
class ConsMain {
private int x;
// constructor
private ConsMain(){
System.out.println(“Constructor Called”);
x = 5;
}
public static void main(String[] args){
ConsMain obj = new ConsMain();
System.out.println(“Value of x = ” + obj.x);
}
}
خروجی
Constructor Called
Value of x = 5
در اینجا ، سازنده ()ConsMain هنگامی که شیء obj ایجاد می شود ، فراخوانی می شود.
یک سازنده ممکن است آرگومان بپذیرد یا نپذیرد.
سازنده بدون آرگومان
اگر سازنده جاوا هیچ پارامتری را نپذیرد ، سازنده بدون آرگومان (no-arg) است. ساختار آن به این شکل است:
accessModifier ClassName() {
// constructor body
}
نمونه سازنده بدون آرگومان
class NoArgCtor {
int i;
// constructor with no parameter
private NoArgCtor(){
i = 5;
System.out.println(“Object created and i = ” + i);
}
public static void main(String[] args) {
NoArgCtor obj = new NoArgCtor();
}
}
خروجی
Object created and i = 5
در اینجا ، سازنده ()NoArgCtor هیچ پارامتری را نمی پذیرد.
آیا متوجه شدید که سازنده ()NoArgCtor از نوع private است؟
این امر به این دلیل است که شی از درون همان کلاس ساخته می شود. از این رو ، می تواند به سازنده دسترسی پیدا کند.
با این حال ، اگر شیء خارج از کلاس ایجاد شده است ، شما دسترسی به آن سازنده را باید public کنید. مثلا:
class Company {
String domainName;
// object is created in another class
public Company(){
domainName = “programiz.com”;
}
}
public class CompanyImplementation {
public static void main(String[] args) {
Company companyObj = new Company();
System.out.println(“Domain name = “+ companyObj.domainName);
}
}
خروجی
Domain name = programiz.com
سازنده پیش فرض
اگر خودتان سازنده ایجاد نکنید ، کامپایلر جاوا به طور خودکار یک سازنده بدون آرگومان را در زمان اجرا ایجاد می کند. این سازنده به عنوان سازنده پیش فرض شناخته می شود. سازنده پیش فرض هر یک از متغیرهای نمونه غیر رسمی را مقدار دهی اولیه می کند.
مثال: سازنده پیش فرض
class DefaultConstructor {
int a;
boolean b;
public static void main(String[] args) {
DefaultConstructor obj = new DefaultConstructor();
System.out.println(“a = ” + obj.a);
System.out.println(“b = ” + obj.b);
}
}
برنامه بالا معادل است با
class DefaultConstructor {
int a;
boolean b;
private DefaultConstructor() {
a = 0;
b = false;
}
public static void main(String[] args) {
DefaultConstructor obj = new DefaultConstructor();
System.out.println(“a = ” + obj.a);
System.out.println(“b = ” + obj.b);
}
}
خروجی
a = 0
b = false
سازنده پارامتری
یک سازنده همچنین ممکن است پارامتر بپذیرد. ساختار آن به شکل زیر است:
accessModifier ClassName(arg1, arg2, …, argn) {
// constructor body
}
مثال: سازنده پارامتری
class Vehicle {
int wheels;
private Vehicle(int wheels){
wheels = wheels;
System.out.println(wheels + ” wheeler vehicle created.”);
}
public static void main(String[] args) {
Vehicle v1 = new Vehicle(2);
Vehicle v2 = new Vehicle(3);
Vehicle v3 = new Vehicle(4);
}
}
خروجی
۲ wheeler vehicle created.
۳ wheeler vehicle created.
۴ wheeler vehicle created.
در اینجا ، ما یک آرگومان از نوع int (تعداد چرخ ها) را در هنگام ایجاد شی به سازنده منتقل کردیم.
سربارگذاری سازنده ها در جاوا
مشابه سربارگذاری متد ، می توانید دو یا چند سازنده هم نام با پارامترهای متفاوت داشته باشید. مثلا:
class Company {
String domainName;
public Company(){
this.domainName = “default”;
}
public Company(String domainName){
this.domainName = domainName;
}
public void getName(){
System.out.println(this.domainName);
}
public static void main(String[] args) {
Company defaultObj = new Company();
Company programizObj = new Company(“programiz.com”);
defaultObj.getName();
programizObj.getName();
}
}
خروجی
default
programiz.com
نکات مهم
- بلافاصله بعد از فراخوانی اشیا، سازندگان فراخوانی می شوند.
- دو قانون ایجاد سازنده عبارتند از:
- نام سازنده جاوا دقیقاً باید با نام کلاس مطابقت داشته باشد.
- یک سازنده جاوا نباید دارای نوع بازگشتی باشد.
- اگر یک کلاس سازنده نداشته باشد ، کامپایلر جاوا به طور خودکار یک سازنده پیش فرض را در زمان اجرا ایجاد می کند. سازنده پیش فرض متغیرهای نمونه را با مقادیر پیش فرض مقدار دهی اولیه می کند. به عنوان مثال: متغیر int برابر ۰ می شود.
- انواع سازنده:
- سازنده No-Arg – سازنده ای که هیچ آرگومانی را قبول نمی کند
- سازنده پیش فرض – سازنده ای که بطور خودکار توسط کامپایلر جاوا ایجاد می شود. ( اگر به صراحت تعریف نشده باشد)
- سازنده پارامتری – برای مشخص کردن مقادیر خاص متغیرها در شی استفاده می شود
- سازندگان نمی توانند abstract یا static یا final باشند.
- سازنده را می توان چندین بار تعریف کرد.