مشخصات مقاله
-
1906
-
0.0
-
4872
-
0
-
0
آموزش Java –کار با Instance initializer block در Java
آموزش Java –کار با Instance initializer block در Java
instance initializer block برای مقداردهی اولیه ی اعضای داده ای و فیلدهای کلاس (instance member ها) بکار می رود. این قطعه کد هر بار که یک نمونه از روی کلاس ساخته می شود، اجرا می گردد.
می توان فیلدهای کلاس را به صورت مستقیم نیز مقداردهی اولیه کرد اما ممکن است عملیات بیشتری به هنگام مقداردهی اولیه ی فیلدها لازم باشد که این کارها را می توان داخل بدنه ی instance initializer block انجام داد.
در همین ابتدای مبحث یک سوال ساده مطرح می شود: استفاده ی instance initializer block یا قطعه کد مقداردهی اولیه به متغیرهای سراسری (instance variable) چیست هنگامی که می توان یک متغیر را مستقیما و به سادگی مقداردهی اولیه کرد؟ مثال:
class Bike{
int speed=100;
}
دلیل استفاده از instance initializer block
شرایطی را در نظر بگیرید که در آن بایستی به هنگام تخصیص مقدار به فیلد و instance variable های کلاس، عملیات دیگری را همزمان انجام دهید. برای مثال، در حین مقداردهی اولیه متغیر، با استفاده از حلقه ی for یک آرایه ی پیچیده را با داده پر کرده یا خطاهای احتمالی را مدیریت نمایید.
استفاده ی کاربردی از instance initializer block
در زیر مثال ساده ای از initializer block را می بینید که عملیات ابتدایی مقداردهی اولیه ی فیلد 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
در زبان جاوا سه مکان برای انجام عملیات تعریف شده است که در زیر به آن ها اشاره می کنیم:
- بدنه ی متد
- تابع سازنده یا بدنه ی constructor
- قطعه کد یا 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
در مثال بالا، در ظاهر چنین به نظر می رسد که ابتدا instance initializer block فراخوانی شده است. اما حقیقت چیز دیگری است. instance initializer block در زمان ایجاد شدن آبجکت از کلاس در حافظه صدا زده می شود. کامپایلر Java قطعه کد instance initializer را پس از اجرای دستور اول تابع سازنده، ()super که خود تابع سازنده ی کلاس پدر می باشد، داخل تابع ()Bike8 جایگذاری می کند. با توجه به آنچه گفته شد، کامپایلر jvm ابتدا تابع سازنده ()Bike8 را صدا می زند. تصویر زیر روند و جریان اجرای برنامه را نشان می دهد:
توجه داشته باشید که کامپایلر jvm قطعه کد مقداردهی اولیه (instance initializer block) را در هر تابع سازنده به طور مجزا جایگذاری می کند.
قوانین حاکم بر instance initializer block:
در کل کامپایلر JVM در خصوص اجرای instance initializer block دو قاعده ی زیر را رعایت می کند:
- instance initializer block به هنگام ساخت آبجکت از روی کلاس در حافظه ایجاد می شود.
- instance initializer block پس از فراخوانی تابع سازنده ی کلاس پدر (super()) صدا خورده می شود.
برنامه ای که instance initializer block در آن پس از اجرای دستور ()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);
}
}
خروجی:
parent class constructor invoked instance initializer block is invoked child class constructor invoked parent class constructor invoked instance initializer block is invoked child class constructor invoked 10