خرداد ۷, ۱۳۹۸ Mostafa بدون دیدگاه

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

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

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

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

در همین ابتدای مبحث یک سوال ساده مطرح می شود: استفاده بلوک سازنده نمونه اولیه از کلاس  یا قطعه کد مقداردهی اولیه به متغیرهای سراسری (instance variable) چیست هنگامی که می توان یک متغیر را مستقیما و به سادگی مقداردهی اولیه کرد؟

 

مثال :

class Bike{  
    int speed=100;  
}

دلیل استفاده از بلوک سازنده نمونه اولیه از کلاس

شرایطی را در نظر بگیرید که در آن بایستی به هنگام تخصیص مقدار به فیلد و instance variable های کلاس، عملیات دیگری را همزمان انجام دهید. برای مثال، در حین مقداردهی اولیه متغیر، با استفاده از حلقه ی for یک آرایه ی پیچیده را با داده پر کرده یا خطاهای احتمالی را مدیریت نمایید.
استفاده ی کاربردی از بلوک سازنده نمونه اولیه از کلاس

در زیر مثال ساده ای از بلوک سازنده نمونه اولیه از کلاس  را می بینید که عملیات ابتدایی مقداردهی اولیه ی فیلد int را نمایش می دهد.

class Bike7{  
    int speed;  
    Bike7(){System.out.println("speed is "+speed);}  
    {speed=100;}  
    public static void main(String args[]){  
    Bike7 b1=new Bike7();  
    Bike7 b2=new Bike7();  
    }      
}

خروجی :

speed is 100
speed is 100

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

  1. بدنه ی متد
  2. تابع سازنده یا بدنه ی constructor
  3. قطعه کد یا block

اولویت فراخوانی با کدام است: instance initializer block یا constructor ؟

class Bike8{  
    int speed;  
    Bike8(){System.out.println("constructor is invoked");}  
    {System.out.println("instance initializer block invoked");}  
    public static void main(String args[]){  
    Bike8 b1=new Bike8();  
    Bike8 b2=new Bike8();  
    }      
}

 

خروجی :

instance initializer block invoked
constructor is invoked
instance initializer block invoked
constructor is invoked

 

در مثال بالا، در ظاهر چنین به نظر می رسد که ابتدا بلوک سازنده نمونه اولیه از کلاس  فراخوانی شده است. اما حقیقت چیز دیگری است. بلوک سازنده نمونه اولیه از کلاس  در زمان ایجاد شدن آبجکت از کلاس در حافظه صدا زده می شود. کامپایلر Java قطعه کد instance initializer را پس از اجرای دستور اول تابع سازنده، ()super که خود تابع سازنده ی کلاس پدر می باشد، داخل تابع ()Bike8 جایگذاری می کند. با توجه به آنچه گفته شد، کامپایلر jvm ابتدا تابع سازنده ()Bike8 را صدا می زند. تصویر زیر روند و جریان اجرای برنامه را نشان می دهد:

توجه داشته باشید که کامپایلر jvm قطعه کد مقداردهی اولیه (بلوک سازنده نمونه اولیه از کلاس ) را در هر تابع سازنده به طور مجزا جایگذاری می کند.

 

قوانین حاکم بر بلوک سازنده نمونه اولیه از کلاس  :

در کل کامپایلر JVM در خصوص اجرای بلوک سازنده نمونه اولیه از کلاس دو قاعده ی زیر را رعایت می کند:

بلوک سازنده نمونه اولیه از کلاس  به هنگام ساخت آبجکت از روی کلاس در حافظه ایجاد می شود.
بلوک سازنده نمونه اولیه از کلاس پس از فراخوانی تابع سازنده ی کلاس پدر (super()) صدا خورده می شود.

برنامه ای که بلوک سازنده نمونه اولیه از کلاس  در آن پس از اجرای دستور ()super فراخوانی می شود.

class A{  
A(){  
System.out.println("parent class constructor invoked");  
}  
}  
class B2 extends A{  
B2(){  
super();  
System.out.println("child class constructor invoked");  
}  
{System.out.println("instance initializer block is invoked");}  
public static void main(String args[]){  
B2 b=new B2();  
}  
}

خروجی :

parent class constructor invoked
instance initializer block is invoked
child class constructor invoked

مثال کاربردی دیگر از instance block

class A{  
A(){  
System.out.println("parent class constructor invoked");  
}  
}  
class B3 extends A{  
B3(){  
super();  
System.out.println("child class constructor invoked");  
}  
B3(int a){  
super();  
System.out.println("child class constructor invoked "+a);  
}  
{System.out.println("instance initializer block is invoked");}  
public static void main(String args[]){  
B3 b1=new B3();  
B3 b2=new B3(10);  
}  
}

 

 


برچسب ها