آموزش جاوا - قسمت پنجم

محمد چنگانی 1395/1/12 2907

آموزش جاوا - قسمت پنجم

جلسه پیش در مورد مفهوم final صحبت کردیم و کاربردش و الزامش در استفاده گفتیم و قرار شد همیشه ازش استفاده کنیم مگه اینکه واقعا نتونیم متغییر یا نمونه‌ای را به صورت final تعریف کنیم.

این جلسه در مورد مفهوم static صحبت می‌کنیم که در نقطه مقابل final هست.

ما می‌تونیم یه متغییر را به این صورت static تعریف کنیم:

public static int a;

بر خلاف final که یک متغییر محلی میتونست به صورت final تعریف بشه. متغییر static نمی‌تونه به صورت محلی باشه.

شاید فراموش کرده باشین متغییر محلی چی هست. وقتی متغییری را در یک متد تعریف کنید به آن متغییر محلی یا local variable می‌گوییم. و نقطه مقابل اون متغییرهایی که به صورت field تعریف میشن متغییرهای‌ سراسری یا همان فیلد گفته میشن.

کد جاوا

همون طور که میبینید متغییر a به صورت field هست و دو متغییر b و c محلی. اگه بخواهیم درست‌تر صحبت کنیم متغییر b یک آرگومان هست و در واقع به ورودی یک متد آرگومان گفته می‌شود.

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

همچنین شما میتونید یک متد را به صورت static تعریف کنید:

کد جاوا

خوب الان که دیدیم چطور میشه یک فیلد یا متد را به صورت static تعریف کنیم، ببینیم مفهوم static چی هست.

وقتی شما یک متغییر یا متد را به صورت static تعریف می‌کنید، در واقع خاصیتی به اون میدین که فقط یک‌بار ساخته می‌شود. در واقع شما اگر از کلاس T به هر تعداد نمونه بسازین، تمام قسمت‌های غیر static به ازای هر نمونه ساختن دوباره ساخته میشه ولی متغییر و متدهای استاتیک یکبار ساخته می‌شود در کل برنامه شما.

متغییر استاتیک در اولین دسترسی به آن یکبار برای تمام طول پروژه ساخته می‌شود حتی اگر از آن کلاس نمونه‌ای ساخته نشود. در واقع خاصیت اصلی static همین هست که بدون نمونه ساختن می‌تونید به آن دسترسی داشته باشید:

کد جاوا

شما الان میتونید بدون نمونه ساختن دسترسی داشته باشین:

System.out.println(T.a);
T.a = 5;
T t = new T();
System.out.println(T.a);

همانطورکه میبینید ما بدون نمونه ساختن می‌تونیم به متغییر و متدهای static یک کلاس دسترسی داشته باشیم. ولی اجازه بدیم حروجی کد بالا رو ببینم:

ایتدا مقدار ۸ برای ما چاپ می‌شود. در خط دوم ما مقداری برای این متغییر set کردیم و در خط سوم نمونه‌آی از کلاس T ساختیم. و در خط چهارم مقدار a را چاپ کردیم.

همانطور که گفته بودیم که متغییر static فقط یکبار ساخته می‌شود پس در نتیجه در خطی که ما از کلاس T نمونه ساختیم، متغییر a ساخته نمی‌شود. بنابراین مقدار ۵ برای ما چاپ می‌شود.

در واقع متغییر static یکبار ساخته می‌شود و در دسترس همه قرار می‌گیرد و مقدار آن به اشتراک گذاشته می‌شود. یعنی اگر کسی آن را عوض کرد برای همه عوض می‌شود.

همین طور یک متد static رو می‌تونید بدون نمونه‌سازی میتونید استفاده کنید.

نکته‌ای که وجود دارد این هست که با اینکه در نظر اول static بودن خیلی خوب هست ولی برعکس عملا بسیار خطرناک هست استفاده کردن از static در یک برنامه شی‌گرا.

قانونی که وجود دارد این هست که به هیچ عنوان از static استفاده نشه مگه این که خلافش ثابت بشه! در واقع همینجاست که نقطه متقابل final قرار میگیرد. علتش هم این هست وقتی شما یک متغییر را به صورت static تعریف می‌کنید دارین اون رو در اختیار همه قرار میدین و مفهوم کپسوله کردن و انتضاعی بودن پروژه ما را تخریب می‌کند.

استفاده از static دوجا خیلی کاربرد دارد (کاربدهای دیگه نیز دارد) و سایر جاهای دیگه میشه از static استفاده نکرد و راه‌حلی برای اون پیدا کرد.

۱- تعریف ثابت:

شما اگه بخواهین ثابتی در جاوا تعریف کنید به این صورت تعریف می‌کنید:

public final static int USER_NUMBER = 10;

در واقع شما ثابتی به نام USER_NUMBER تعریف کردین که مقدار آن ۱۰ هست و چون final هست غیر قابل تغییر هست و همچنین بدون نمونه ساختن هرکسی میتونه به این متغییر دسترسی داشته باشد.

این در واقع مفهوم ثابت را در جاوا تداعی می‌کند.

۲- نیاز به نمونه یا متغییری که در کل پروژه یکبار ساخته شود و همه به آن نیاز داشته باشند:

دقت کنید که شرط یکبار ساخته شدن و همه به آن نیاز داشته باشن باید همزمان وجود داشته باشد وگرنه شما می‌تونید راهی برای آن پیدا کنید که static تعریف نکنید.

مثلا فکر کنید شما یک کلاس برای گزارش گیری یا log ساخته‌اید. یک پروژه نیاز دارد همه گزارش‌های خود را یک نمونه بسازد و آن‌ها را ذخیره کند و همچنین همه به گزارش گیری نیاز دارند. پس بهتر هست این نمونه از کلاس log به صورت static تعریف شود.

خوب اگه تا اینجا براتون سوالی پیش اومده بنده در خدمتم وگرنه بریم سراغ قسمت دوم آموزشمون، آرایه ها در جاوا

آرایه در زبان جاوا به این صروت تعریف می‌شوند:

int[] array = new int[10];

و همچنین:

array[0] = 7;
System.out.println(array[3]);
System.out.println(array.length);

در خط اول ما آرایه‌ای به اندازه ۱۰ ساخته‌ایم و در خط دوم برای خانه‌ی ۰ آن مقدار ۷ set کردیم و در خط بعدی خانه ۳ آن را چاپ کردیم. و در خط چهارم طول آرایه که برابر اس ت با ۱۰ را چاپ می‌کند.

همچنین شما می‌تونید از کلاس‌های نیز آرایه بسازین:

Student[] students = new Student[3];

دقت کنید وقتی آرایه‌ای از کلاس ها میسازیم، در واقع خانه‌های حافظه را به اندازه آرایه رزرو می‌کنیم ولی در ابتدا مقدار این خانه ها برابر null هست.

System.out.println(students[0].getName());

بنابراین لازم هست برای استفاده از هر خانه ابتدا ان را new کنیم:

students[0] = new Student();
System.out.println(students[0].getName());

همچنین ما میتوانیم یک آرایه را با مقدار دهی اولیه تعریف کنیم:

int[] array = {1, 2, 5, 7, 9};
System.out.println(array[3]);

در جلسه بعدی بحث آرایه ها رو بیشتر باز میکنیم و نکات مربوط به اون رو میگیم و همینطور در مورد آرایه‌های دو بعدی صحبت می‌کنیم.

قواعد نگارشی جاوا:

۱- متغییرهای که به صورت ثابت تعریف می‌شوند همیشه تماما با حروف بزرگ نوشته می‌شود و برای فاصله از ـ استفاده میشود:

public final static int NUMBER =10
public final static int STUDENT_NUMBER =10

۲- اسم متغییرهای‌ که به صورت آرایه تعریف می‌شوند بهتر است به صورت جمع اسم‌:ذاری شود:

int[] numbers = new int[7];
Student[] students = new Student[9];

۳- متدهایی که برای ما به دنبال چیز خاصی میگردنند را بهتر است در نام گذاری آن‌ها از کلمه find استفاده شود:

vertex.findNearestVertex()
problem.findBestSolution()

دانلود PDF قسمت پنجم آموزش جاوا

قسمت بعدی قسمت قبلی