logo

מדוע לא ניתן להפנות למשתנה לא סטטי מהקשר סטטי ב-Java

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

שיטה סטטית

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

שיטה לא סטטית

כל השיטות בלי שיש סטָטִי מילת מפתח לפני שם השיטה נקראים לא סטטי שיטות. אין צורך ליצור מופע של המחלקה לגישה למתודה הסטטית ולמשתנה הסטטי. השיטות הלא סטטיות משמשות כריכה דינמית או ריצה. בניגוד סטָטִי שיטה, אנחנו יכולים לעקוף את לא סטטי שיטה.

בואו ניצור תוכנית Java וניצור את אותה שגיאה.

enum tostring java

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

StaticExample1.java

 public class StaticExample { private int number=0; public static void main(String args[]){ number++; System.out.println(number); } } 

תְפוּקָה:

java הממיר מספר שלם למחרוזת
מדוע לא ניתן להפנות למשתנה לא סטטי מהקשר סטטי ב-Java

עכשיו, בואו נכריז על המשתנה מספר כסטטי והידור הקוד. שים לב שהמשתנה והשיטה main() הן סטטיות.

StaticExample2.java

 class staticExample { private static int number=0; public static void main(String args[]){ number++; System.out.println(number); } } 

תְפוּקָה:

מדוע לא ניתן להפנות למשתנה לא סטטי מהקשר סטטי ב-Java

התוכנית מתארגנת ופועלת בהצלחה.

לכל מופע של משתנה לא סטטי יש ערך שונה והוא נוצר כאשר האופרטור new() מאתחל מופע של אובייקט. המשתנים הסטטיים נוצרים או מאותחלים כאשר המחלקה נטענת לתוך JVM .

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

מארח לינוקס

StaticExample3.java

 class variable { int number; public static void increment() { number++; } } class StaticExample { public static void main(String args[]) { variable var1 = new variable(); variable var2 = new variable(); variable var3 = new variable(); var1.number = 12; var2.number = 13; var3.number = 14; variable.increment(); System.out.println(var1.number); System.out.println(var2.number); System.out.println(var3.number); } } 

תְפוּקָה:

מדוע לא ניתן להפנות למשתנה לא סטטי מהקשר סטטי ב-Java

בתוכנית לעיל, שלושה אובייקטים, var1, var2, var3 , נוצרים עבור הכיתה מִשְׁתַנֶה והקצו לשלושת הערכים השונים 12, 13, 14 עבור האובייקטים var1, var2 , ו גרסה 3 , בהתאמה. עכשיו ה מספר למאפיין של כל אובייקט יש ערך מספר שלם משלו. כאשר אנו מנסים להגדיל את הערך של המאפיין number על ידי קריאה למתודה increment() , המהדר לא מבין עבור איזה ערך של מספר השיטה צריכה להגדיל את הערך. המהדר מתמודד עם שגיאת העמימות וזורק את שגיאת זמן ההידור לא ניתן להתייחס למשתנה לא סטטי מהקשר סטטי .

פתרון לשגיאה

יש דרך אחת פשוטה לפתור את לא ניתן להתייחס למשתנה לא סטטי מהקשר סטטי שְׁגִיאָה. בקוד לעיל, עלינו להתייחס למשתנה הלא סטטי עם שם האובייקט. בצורה פשוטה, עלינו ליצור אובייקט של המחלקה כדי להתייחס למשתנה לא סטטי מהקשר סטטי. עותק חדש של כל המשתנים הלא סטטיים נוצר כאשר נוצר מופע חדש של משתנה. אז, אנחנו יכולים לגשת למשתנים האלה באמצעות הפניה של המופע החדש של המחלקה. לדוגמה, שקול את תוכנית Java הבאה.

נתיב שנקבע ב-java

StaticExample4.java

 class staticExample { int number = 0; public static void main(String args[]) { // using non-static variable by creating an object of the class staticExample test = new staticExample(); test.number++; System.out.println(test.number);a } } 

תְפוּקָה:

מדוע לא ניתן להפנות למשתנה לא סטטי מהקשר סטטי ב-Java

תיאור

בתוכנית לעיל, אנו ניגשים למאפיין number באמצעות שם המחלקה staticExample. אנו יוצרים אובייקט בשם המחלקה StaticExample מִבְחָן ולהגדיל את ערך המספר באמצעות אובייקט הבדיקה.