ورود

View Full Version : سوال در مورد کلمه کلیدی static



Sina.iRoid
چهارشنبه 24 تیر 1394, 19:42 عصر
سلام
لطف کنید کد زیر و نگاه کنید:


public class MainClass {

static int a = 3;
static int b;

static void meth(int x) {
System.out.println("X = " + x);
System.out.println("a = " + a);
System.out.println("b = " + b);
}

static {
System.out.println("Static block initialized.");
b = a * 4;
}

public static void main(String[] args) {
meth(42);
}


}


سوال من در در مورد متد زیره:


static {
System.out.println("Static block initialized.");
b = a * 4;
}


چرا این متد اسم نداره و فقط نوشته شده استاتیک؟

محمد فدوی
چهارشنبه 24 تیر 1394, 21:47 عصر
سلام. بلوک static یا Static Class Initializer یه بلوکه که موقع لود شدن کلاس توسط ClassLoader اجرا می‌شه. البته «موقع لود شدن کلاس» رو با اجرا شدن متد main اشتباه نگیر. کلاس‌ها همگی یکبار لود می‌شن و این لود شدن هم درست قبل از اجرای متد main انجام می‌شه.
کاربردش هم مثلا می‌تونه چک کردن این باشه که آیا درایور MySQL در دسترس هست؟! اگر نیست همون موقع خطای لازم رو تولید و از اجرای برنامه جلوگیری کنه. یا مثلا فرض کن می‌خوای مجموع اعداد یک تا ده رو به‌عنوان یه ثابت داشته باشی...
راه اول:

public class Foo {
public static final int ONE_TO_TEN = calculateOneToTen();

private static final int calculateOneToTen() {
int result = 0;
for(int i = 1; i <= 10; i++) {
result += i;
}
return result;
}
}


راه دوم با استفاده از بلوک static:

class Bar {
public static final int ONE_TO_TEN;

static {
int oneToTen = 0;
for(int i = 1; i <= 10; i++) {
oneToTen += i;
}
ONE_TO_TEN = oneToTen;
}
}


البته Class Initializerهای غیر static هم توی جاوا داریم که یه بلوک ساده‌ان بدون هیچ نامی که توی کلاس قرار می‌گیرن:

class Baz {
{
// non-static class initializer
}
// ...
}

بهترین کاربردی که من از Class Initializerهای غیراستاتیک دیدم، توی ساختن اشیاءی هست که خیلی با متدهاشون کار داریم (البته بهتره در استفاده ازش زیاده‌روی نشه چون باعث ایجاد فایل‌های class. بیشتری می‌شه):

public static void main(String[] args) {
HashMap<String, String> ccities = new HashMap() {{
put("Iran", "Tehran");
put("USA", "Washington");
put("UK", "London");
put("...", "...");
}};
}

که خیلی وقتا می‌تونه خوانایی و زیبایی کد رو دوچندان کنه. موفق باشی.

http://stackoverflow.com/questions/2943556/static-block-in-java