مشخصات مقاله
-
2372
-
0.0
-
22836
-
0
-
0
آموزش کاربرد کلیدواژه ی Static در Java
آموزش Java – کاربرد کلیدواژه ی Static در Java
کلیدواژه ی static در زبان Java غالبا برای مدیریت حافظه بکار می رود. می توان این کلیدواژه را به متغیر، متد، قطعه کد و کلاس های تودرتو (کلاس هایی که داخل کلاس دیگری تعریف شده اند) اعمال کرد. کلیدواژه ی نام برده به خود کلاس (برای مثال متغیر موجود در کلاس کلی) اعمال می شود نه نمونه یا نمونه هایی که از روی کلاس مورد نظر ساخته شده اند. برای مثال متغیری که با static تعریف شده باشد، می تواند بدون ساخته شدن نمونه از کلاس میزبان فراخوانی شود و بین تمامی نمونه های کلاس مشترک می باشد.
تمامی اعضای زیر می توانند به صورت static تعریف شوند:
- متغیر (متغیر عضو کلاس)
- متد (متد کلاس)
- قطعه کد
- کلاس تودرتو و تعریف شده داخل کلاس دیگر
متغیرهایی که با کلیدواژه ی static نشانه گذاری شده اند
زمانی که شما متغیری را به صورت static تعریف کرده و آن را با کلیدواژه ی static علامت گذاری می کنید، در حقیقت آن متغیر را بین تمامی نمونه های کلاس مورد نظر مشترک و مستقل از آن ها اعلان می نمایید. متغیر static متعلق به کلاس اصلی بوده و از نمونه های ساخته شده از روی کلاس مستقل می باشد. برای دسترسی به این نوع متغیر نیازی به ساخت آبجکت از روی کلاس نیست.
- متغیر static به property مشترک بین تمامی آّبجکت یا نمونه های ساخته شده از روی کلاس متعلق است. به عبارت دیگر مختص نمونه ی خاصی از کلاس نیست. برای مثال می توان به اسم شرکت کارکنان ، اسم کالج دانشجویان و غیره ... اشاره کرد.
- به متغیر static تنها در class area، یکبار زمانی که کلاس بارگذاری می شود، حافظه اختصاص می یابد.
مزیت های استفاده از متغیر static
در استفاده از حافظه صرفه جویی می کند.
مشکلاتی که در صورت عدم استفاده از متغیر static رخ می دهد
class Student{
int rollno;
String name;
String college="ITS";
}
فرض کنید 500 دانش آموز در کالج در حال تحصیل هستند. اکنون هربار که آبجکتی ایجاد می شود، تمامی عضوهای داده ای نمونه ساخته شده از روی کلاس در حافظه فضایی را به خود اختصاص می دهند. تمامی دانش آموزان rollno و name اختصاصی خود را دارند. متغیر college به property مشترک بین تمامی آبجکت های ساخته شده از روی کلاس اشاره دارد. اگر این متغیر را static تعریف کنید، آنگاه به متغیر مزبور تنها یکبار حافظه تخصیص می یابد.
propertyیا متغیرهایی که با کلیدواژه ی static نشانه گذاری می شوند، بین تمامی آبجکت های ساخته شده از روی کلاس مشترک هستند.
مثال کاربردی از متغیر static
//Program of static variable
class Student8{
int rollno;
String name;
static String college ="ITS";
Student8(int r,String n){
rollno = r;
name = n;
}
void display (){System.out.println(rollno+" "+name+" "+college);}
public static void main(String args[]){
Student8 s1 = new Student8(111,"Karan");
Student8 s2 = new Student8(222,"Aryan");
s1.display();
s2.display();
}
}
Output:111 Karan ITS
222 Aryan ITS
یک نمونه ی کاربردی از متغیر متعلق به نمونه از کلاس بدون کلیدواژه ی static
در مثال حاضر می بینید که یک متغیر متعلق به نمونه ی کلاس (instance variable) به نام count ایجاد کرده ایم که در بدنه ی تابع سازنده یک واحد به مقدار آن اضافه می شود. از آنجایی که متغیر متعلق به نمونه ی کلاس، در زمان ایجاد آبجکت حافظه به خود اختصاص می دهد، هر آبجکت یک کپی یا نمونه ی عینی از instance variable داشته و زمانی که یک واحد به مقدار آن اضافه می شود، این تغییر بر روی سایر آبجکت های ساخته شده از روی کلاس، اعمال نمی شود. بنابراین هر آبجکت مقدار 1 را در متغیر count خود خواهد داشت.
class Counter{
int count=0;//will get memory when instance is created
Counter(){
count++;
System.out.println(count);
}
public static void main(String args[]){
Counter c1=new Counter();
Counter c2=new Counter();
Counter c3=new Counter();
}
}
خروجی:
1 1 1
تعریف متغیر counter با کلیدواژه ی static
همان طور که در بالا ذکر شد، متغیر static تنها یکبار زمان بارگذاری کلاس در حافظه، فضایی از حافظه را به خود تخصیص می دهد. حال اگر آبجکتی از کلاس میزبان، مقدار متغیر static را در بدنه ی خود تغییر دهد، متغیر مذکور مقدارش را حفظ می کند.
class Counter2{
static int count=0;//will get memory only once and retain its value
Counter2(){
count++;
System.out.println(count);
}
public static void main(String args[]){
Counter2 c1=new Counter2();
Counter2 c2=new Counter2();
Counter2 c3=new Counter2();
}
}
خروجی:
1 2 3
کاربرد متد static در Java
زمانی که کلیدواژه ی static را به یک متد اعمال می کنید، آن متد تحت عنوان static شناخته می شود.
- یک متد static به کل کلاس میزبان تعلق دارد و مستقل از نمونه های ساخته شده از روی کلاس می باشد.
- یک متد static می تواند بدون نیاز به ایجاد نمونه از روی کلاس فراخوانی شود.
- یک متد static می تواند به عضوهای داده ای static دسترسی داشته و مقدار آن ها را دستکاری کند.
مثال کاربردی از متد static
//Program of changing the common property of all objects(static field).
class Student9{
int rollno;
String name;
static String college = "ITS";
static void change(){
college = "BBDIT";
}
Student9(int r, String n){
rollno = r;
name = n;
}
void display (){System.out.println(rollno+" "+name+" "+college);}
public static void main(String args[]){
Student9.change();
Student9 s1 = new Student9 (111,"Karan");
Student9 s2 = new Student9 (222,"Aryan");
Student9 s3 = new Student9 (333,"Sonoo");
s1.display();
s2.display();
s3.display();
}
}
خروجی:
111 Karan BBDIT 222 Aryan BBDIT 333 Sonoo BBDIT
مثال کاربردی دیگر از یک متد static که محاسبات معمولی ریاضی را انجام می دهد
//Program to get cube of a given number by static method
class Calculate{
static int cube(int x){
return x*x*x;
}
public static void main(String args[]){
int result=Calculate.cube(5);
System.out.println(result);
}
}
خروجی:
125
محدودیت ها و کاستی های متدهای static
در زیر به دو محدودیت عمده که در استفاده از متدهای static با آن مواجه می شوید، اشاره شده است:
- متد static قابلیت دسترسی به فیلدهای غیر static و فراخوانی متدهای غیر static را به صورت مستقیم ندارد.
- امکان استفاده از کلیدواژگان super و this در بستر کدهای static وجود ندارد.
class A{ int a=40;//non static public static void main(String args[]){ System.out.println(a); } }خروجی:
Compile Time Error
شرح علت static بودن متد main در Java
از آنجایی که متد main داخل کلاس A تعریف شده و زمانی که دستگاه مجازی جاوا (jvm) می خواهد برنامه را اجرا کند، هیچ آبجکتی از کلاس مزبور وجود ندارد که به واسطه ی آن متد main بخواهد فراخوانی شود، متد main همیشه static تعریف می شود.
قطعه کد Static در Java
- برای مقداردهی اولیه ی اعضای داده ای static بکار می رود.
- قبل از متد main در زمان بارگذاری کلاس در حافظه، اجرا می شود.
مثال کاربردی از قطعه کد static
class A2{
static{System.out.println("static block is invoked");}
public static void main(String args[]){
System.out.println("Hello main");
}
}
خروجی:
static block is invoked Hello main
آیا می توان یک برنامه را بدون متد main() اجرا کرد؟
بله، یک روش فراخوانی آن استفاده از قطعه کد static می باشد. اما این امر در ورژن های قبلی JDK امکان پذیر بوده و در JDK 1.7 دیگر ممکن نمی باشد.
class A3{
static{
System.out.println("static block is invoked");
System.exit(0);
}
}
خروجی:
static block is invoked (if not JDK7)
اما در JDK 1.7 به بالا، خطای زیر صادر می شود.
خروجی:
Main method not found in class A3, please define the main method as: public static void main(String[] args)