CodeGym /בלוג Java /Random-HE /היקף Java
John Squirrels
רָמָה
San Francisco

היקף Java

פורסם בקבוצה
כולנו יודעים שלמדינות יש גבולות וחוקים משלהן. חוקי המדינה פועלים בגבולות. גם בארץ יש, למשל, ארגונים, כמו בתי ספר או מוזיאונים, שיש להם חוקים מקומיים משלהם. הם אינם סותרים את חוקי המדינה, אלא פועלים רק במסגרת הארגון שצוין. כך גם בתכנות. אז בתכנות, ובמיוחד בשפת ג'אווה, יש מונח "היקף". זה מתייחס לאזורים בתוכנית שבהם עובדים נתונים מסוימים, כגון משתנים או שיטות. במאמר זה, אנו הולכים להבין מהם היקפים עבור משתנים ב-Java וכיצד להגדיר אותם.

Java Scope באופן כללי

מדוע יש צורך להפריד בין היקפים של משתנים ושיטות? העובדה היא שלפעמים תוכניות גדולות מאוד ויכול להיות קשה לעקוב אחר משתנה כזה או אחר. בנוסף, בפרויקטים גדולים רצוי מתן שמות ברורים למשתנים כדי שיהיה ברור למה הם מיועדים. Scope מאפשר לך לקבל משתנים שונים עם אותו שם בחלקים שונים של התוכנית. קוד כזה קל יותר לתחזוקה וקריאה. היקף Java מגדיר היכן משתנה או שיטה מסוימים נגישים בתוכנית. בקצרה:
  • משתנה המוצהר בשיטה נראה מתחילת ההצהרה ועד סוף השיטה (היקף השיטה).
  • משתנה שהוכרז בבלוק קוד קיים עד סוף בלוק הקוד הזה.
  • משתנים שהם ארגומנטים של שיטה קיימים עד סוף השיטה.
  • משתני מחלקה/אובייקט קיימים לכל החיים של האובייקט המכיל. הנראות שלהם מווסתת על ידי משנה גישה מיוחדים.
  • משתני מחלקה סטטיים קיימים כל הזמן שהתוכנית פועלת. הנראות שלהם נקבעת גם על ידי משנה גישה.

היקף רמת השיטה

כל משתנה שהוכרז בשיטה, כולל ארגומנטים, אינו נגיש מחוץ לשיטה זו. כל המשתנים המוצהרים בתוך שיטות גלויים מתחילת ההכרזה שלהם ועד סוף השיטה. להלן דוגמה להיקף משתנה המתודה:
public class JScopeTest1 {


   public static void main(String[] args) {

       System.out.println(myMethod(5));
       System.out.println(myMethod(17));

   }
   public static int  myMethod(int arg) {
       int secondArg = 100; //local method variable
       return secondArg + arg;
   }
}
כאן יש לנו secondArg , משתנה מקומי או ארגומנט מתודה. אנחנו לא יכולים להשתמש במשתנה זה מחוץ לשיטת myMethod או לפני שהוא הוכרז. אם משתנה הוא ארגומנט פונקציה, אז הוא גלוי בכל הגוף של שיטה זו. בדוגמה שלמעלה יש לנו שני טיעונים כאלה: arg ב-myMethod ו-args בשיטה הראשית.

היקף ברמת הכיתה

היקף ברמת מחלקה (משתני מופע) - כל משתנה המוצהר במחלקה זמין עבור כל השיטות של אותה מחלקה. בהתאם לשינוי הגישה שלו (כלומר ציבורי או פרטי), לפעמים ניתן לגשת אליו מחוץ לכיתה. אז אם משתנה הוא משתנה מחלקה, אז הוא קשור לאובייקט מסוים וקיים כל עוד יש אובייקט מהמחלקה הזו. אם אין אובייקט, אז אין עותק של המשתנה. המשתנה גלוי מכל השיטות של המחלקה, ללא קשר אם הם מוצהרים לפניו או אחריו. לכל אובייקט יש משתנה משלו ללא תלות באובייקטים אחרים. גישה למשתנה משיטות סטטיות אינה אפשרית.

דוגמה לקוד

public class Student {

//class level variables
   public String surname;
   String name;
   String secondName;
   private Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

   @Override
   public int hashCode(){
       //TODO: check for nulls
       //return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());
       return (surname + name + secondName + birthday).hashCode();
   }
   @Override
   public boolean equals(Object other_) {
       Student other = (Student)other_;
       return (surname == null || surname.equals(other.surname) )
               && (name == null || name.equals(other.name))
               && (secondName == null || secondName.equals(other.secondName))
               && (birthday == null || birthday.equals(other.birthday));
   }
}
שם משפחה , שם , שם שני ויום הולדת הם משתני מופע.

בלוק סקופ

אם משתנה מוגדר/מוכרז בגוש קוד כלשהו, ​​אז הוא קיים עד סוף גוש הקוד הזה. בדרך כלל, משתנים כאלה קיימים בין הפלטה המתולתלת שבהם הם מוגדרים. לעתים קרובות מאוד היקף בלוק יכול להיות משתנה לולאה. משתנה שהוכרז במצב for loop אינו נגיש מחוץ ללולאה, אלא אם הגדרתם אותו מראש.
public class JScopeTest2 {
   public static void main(String[] args) {
       for (int i = 0; i < 10; i++) {
           int sum = 0;
           sum = sum + i;
       }

       int sum = 1;
       System.out.println(sum);
   }
}
גם משתני סכום ראשון וגם משתנים i מוצהרים בתוך הלולאה ואינם קיימים מחוץ ללולאה זו. עם זאת, הסכום השני הוכרז מחוץ ללולאה כך שהמשתנה המסוים הזה יודפס.

משתנים סטטיים

אם משתנה מוכרז כסטטי (מסומן במילת המפתח הסטטית), אז הוא קיים כל עוד המחלקה שלו קיימת. בדרך כלל, ה-JVM טוען מחלקה לזיכרון בשימוש הראשון, כאשר משתנים סטטיים מאותחלים.
import java.util.Date;

public class Student {
   public static int today = 2022;
   String surname;
   String name;
   String secondName;
   Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }


   public static void main(String[] args) {
       System.out.println(today);
   }

}
אין ליצור מופע חדש של Student class כדי להשתמש במשתנה הסטטי היום . כאן יודפס "2022".

משנה גישה

ל-Java יש 4 מגני גישה להגבלת הגישה לשיטה או למשתנה. אתה יכול להשתמש בהם בתוך מחלקות, לא בתוך שיטות.
  • פרטי הוא השינוי המגביל ביותר. זה מגביל את הגישה לשיטות ומשתנים למחלקה עליהן הוכרזו. אם אין צורך להשתמש בשיטות או משתנים מסוימים מחוץ למחלקה, השתמש ב-private. משתני מחלקה הם בדרך כלל פרטיים ב-Java.

  • אם לא צוין שינוי גישה, השיטה או המשתנה יקבלו את משנה ברירת המחדל . ברירת המחדל מאפשרת גישה רק מהחבילה הנוכחית.

  • protected modifier מאפשר גישה למתודה או למשתנה רק מתוך החבילה הנוכחית, אלא אם הגישה אליו מתבצעת דרך כיתת ילד מחוץ לחבילה.

  • הציבור הוא השינוי הכי פחות מגביל. זה מאפשר לך לגשת למחלקה, שיטה או משתנה לא רק מהמחלקה שהם מוכרזים, אלא גם מבחוץ. השינוי הזה משמש לעתים קרובות מאוד.

הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION