count
השדה סטטי במחלקה Counter
, זה אומר שאתה יכול להתייחס למשתנה באמצעות הביטוי הבא: Counter.count
. 
private
שדות זמינים רק בתוך המחלקה שבה הם מוצהרים. ושדות protected
זמינים לכל המחלקות בתוך חבילה, כמו גם לכל תת המחלקות שלהם מחוץ לחבילה. נניח שלמחלקה Counter
יש שיטה סטטית increment()
שתפקידה להגדיל את count
השדה. כדי לקרוא לשיטה זו, אתה יכול להשתמש Counter.increment()
. אין צורך ליצור מופע של המחלקה Counter
כדי לגשת לשדה או שיטה סטטית. זהו ההבדל המהותי בין משתנים ושיטות סטטיים (מחלקה) לבין משתנים ומתודות שאינם סטטיים (מופע). הערה חשובה. אל תשכח שהחברים הסטטיים של המחלקה שייכים ישירות למחלקה, לא כל מופע של המחלקה. כלומר, הערך של count
המשתנה הסטטי יהיה זהה עבור כל Counter
האובייקטים. במאמר זה, נסקור את ההיבטים הבסיסיים של השימוש בשינוי הסטטי ב-Java, כמו גם כמה תכונות שיעזרו לך להבין מושגי תכנות מרכזיים.
מה שכל מתכנת צריך לדעת על השינוי הסטטי בג'אווה.
בחלק זה, אנו בוחנים את ההיבטים העיקריים של שימוש בשיטות סטטיות, שדות ומחלקות. נתחיל עם המשתנים.-
אינך יכול לגשת לחברים שאינם סטטיים של מחלקה בהקשר סטטי, כגון שיטה או בלוק סטטי. הידור של הקוד למטה יגרום לשגיאה:
public class Counter { private int count; public static void main(String args []) { System.out.println(count); // Compile time error } }
זוהי אחת הטעויות הנפוצות ביותר שנעשו על ידי מתכנתי Java, במיוחד חדשים. מכיוון שהמתודה
main
היא סטטית והמשתנהcount
לא, השימושprintln
בשיטה בתוךmain
השיטה תיצור "שגיאת זמן קומפילציה". -
בניגוד למשתנים מקומיים, שדות ושיטות סטטיים אינם
thread safe
ב-Java. בפועל, זהו אחד הגורמים השכיחים ביותר לבעיות אבטחה בתכנות מרובה הליכי. בהתחשב בכך שכל מופע של מחלקה מתייחס לאותו עותק של משתנה סטטי, משתנה כזה צריך להיות מוגן או "נעול" על ידי המחלקה. לכן, בעת שימוש במשתנים סטטיים, ודא שהם תקיניםsynchronized
כדי למנוע בעיות כגוןrace conditions
. -
לשיטות סטטיות יתרון מעשי בכך שאין צורך ליצור אובייקט חדש בכל פעם שרוצים לקרוא להם. ניתן לקרוא למתודה סטטית באמצעות שם המחלקה שמצהירה עליה. לכן השיטות הללו מושלמות לשיטות
factory
ושיטותutility
. המחלקהjava.lang.Math
היא דוגמה נפלאה: כמעט כל השיטות שלה הן סטטיות. מחלקות השירות של Java מסומנותfinal
מאותה סיבה. -
נקודה חשובה נוספת היא שאינך יכול לעקוף (
@Override
) שיטות סטטיות. אם אתה מצהיר על שיטה כזו ב-subclass
, כלומר שיטה עם אותו שם וחתימה, אתה פשוט "מסתיר" את השיטה של ה-superclass
במקום לעקוף אותה. תופעה זו ידועה בשםmethod hiding
. המשמעות היא שאם מוצהרת שיטה סטטית גם בכיתות האב וגם בכיתות הילד, השיטה שנקראת תהיה תמיד מבוססת על סוג המשתנה בזמן ההידור. בניגוד לעקוף שיטה, שיטות כאלה לא יבוצעו כאשר התוכנית פועלת. הבה נשקול דוגמה:class Vehicle { public static void kmToMiles(int km) { System.out.println("Inside the parent class / static method"); } } class Car extends Vehicle { public static void kmToMiles(int km) { System.out.println("Inside the child class / static method"); } } public class Demo { public static void main(String args []) { Vehicle v = new Car(); v.kmToMiles(10); } }
פלט מסוף:
בתוך מחלקת האב / שיטה סטטית
הקוד מדגים בבירור שלמרות העובדה שהאובייקט הוא
Car
, השיטה הסטטית במחלקהVehicle
נקראת, מכיוון שהמתודה נקראה בזמן הקומפילציה. ושימו לב שלא היו שגיאות קומפילציה! -
יתרה מכך, מלבד מחלקות ברמה העליונה, אתה יכול להכריז על מחלקות סטטיות. שיעורים כאלה ידועים בשם
nested static classes
. הם שימושיים למתן לכידות טובה יותר. דוגמה בולטת למחלקה סטטית מקוננת היאHashMap.Entry
, שהיא מבנה נתונים בפניםHashMap
. ראוי לציין שכמו מחלקות פנימיות, מחלקות מקוננות סטטיות מוצהרות בקובץ .class נפרד. לפיכך, אם תכריז על חמש מחלקות מקוננות במחלקה הראשית שלך, יהיו לך 6 קבצים עם סיומת .class. דוגמה נוספת היא ההכרזה משלנוComparator
, כגון משווה גיל (AgeComparator
) בכיתהEmployee
. -
ניתן לציין את השינוי הסטטי גם בבלוק סטטי, הידוע יותר בשם "גוש אתחול סטטי", שמתבצע כאשר המחלקה נטענת. אם אתה לא מצהיר על בלוק כזה, Java אוספת את כל השדות הסטטיים לרשימה אחת ומאחלת אותם כשהמחלקה נטענת. בלוק סטטי לא יכול לזרוק חריגים מסומנים, אבל הוא יכול לזרוק חריגים לא מסומנים. במקרה זה,
ExceptionInInitializerError
תתרחש צוואה. בפועל, כל חריג שיתרחש במהלך אתחול של שדות סטטיים יעטוף בשגיאה זו על ידי Java. זו גם הסיבה השכיחה ביותר ל-NoClassDefFoundError
, מכיוון שהכיתה לא תהיה בזיכרון כאשר היא מוזכרת. -
זה שימושי לדעת ששיטות סטטיות מקושרות בזמן הידור, בניגוד לקישור של שיטות וירטואליות או לא סטטיות, המקושרות בזמן ריצה כשהן נקראות על אובייקט אמיתי. בהתאם לכך, לא ניתן לעקוף שיטות סטטיות ב-Java, שכן פולימורפיזם אינו חל עליהן בזמן הריצה. זוהי מגבלה חשובה שיש לקחת בחשבון כאשר מכריזים על שיטה סטטית. לעשות זאת הגיוני רק כאשר אין יכולת או צורך לעקוף את השיטה בתת-מחלקה. שיטות מפעל ושיטות שירות הן דוגמאות טובות לשימוש נכון במשנה הסטטי. ג'ושוע בלוך מציין מספר יתרונות שיש לשיטות מפעל סטטיות על פני קונסטרוקטורים בספרו Effective Java, שחובה לקרוא לכל מתכנת Java.
-
אתחול הוא היבט חשוב של בלוק סטטי. שדות או משתנים סטטיים מאותחלים לאחר טעינת המחלקה לזיכרון. סדר האתחול הוא מלמעלה למטה, באותו סדר שבו הם מוצהרים בקובץ המקור של מחלקת Java. מכיוון ששדות סטטיים מאותחלים בצורה בטוחה לחוטים, תהליך זה משמש גם ליישום התבנית
Singleton
. אם אינך משתמש ב-Enum
as aSingleton
מסיבה כלשהי, אז יש לך אלטרנטיבה טובה. אבל במקרה זה, עליך לקחת בחשבון שלא מדובר באתחול "עצלן". זה אומר שהשדה הסטטי יאותחל אפילו לפני שמישהו "יבקש" אותו. אם אובייקט כבד במשאבים או בשימוש נדיר, אז האתחול שלו בבלוק סטטי לא יעבוד לטובתך. -
במהלך סדרה, שדות סטטיים, כמו
transient
משתנים, אינם מסודרים. ואכן, אם תשמור נתונים בשדה סטטי, הוא יכיל את הערך הראשוני (ברירת המחדל) שלו לאחר דה-סריאליזציה. לדוגמה, אם שדה סטטי הואint
, הערך שלו יהיה אפס לאחר דה-סריאליזציה. אם הסוג שלו הואfloat
, הערך יהיה 0.0. אם השדה הואObject
, הערך יהיהnull
. למען האמת, זו אחת השאלות הנפוצות ביותר לגבי סדרה בראיונות לתפקידי Java. אל תאחסן נתוני אובייקט חיוניים בשדה סטטי! -
לבסוף, בואו נדבר על יבוא סטטי. לשינוי זה יש הרבה מן המשותף להצהרה הסטנדרטית
import
, אך הוא שונה בכך שהוא מאפשר לייבא אחד או את כל חברי המחלקה הסטטית. לאחר מיובאים של שיטות סטטיות, ניתן לגשת אליהן כאילו הוכרזו באותה מחלקה. באופן דומה, על ידי ייבוא שדות סטטיים, נוכל לגשת אליהם מבלי לציין את שם המחלקה. תכונה זו הופיעה ב-Java 1.5 ומשפרת את קריאת הקוד בשימוש נכון. מבנה זה נמצא לרוב בבדיקות JUnit, מכיוון שכמעט כל מפתחי הבדיקות משתמשים בייבוא סטטי עבור שיטות טענה, למשלassertEquals()
והגרסאות העמוסות שלהם. -
זה הכל לעת עתה. כל מתכנת Java צריך לדעת את כל ההיבטים של השינוי הסטטי שהוזכר לעיל. מאמר זה סקר מידע בסיסי על משתנים סטטיים, שדות, שיטות, בלוקי אתחול וייבוא. זה גם נגע בכמה מאפיינים חשובים שחיוני לדעת כדי לכתוב ולהבין תוכניות Java. אני מקווה שכל מפתח ישכלל את השימוש המיומן שלו בחברים סטטיים, כי זה חשוב מאוד לפיתוח תוכנה רציני".
GO TO FULL VERSION