מדריך ליצירת אובייקטים בג'אווה

1. סקירה כללית

במילים פשוטות, לפני שנוכל לעבוד עם אובייקט ב- JVM, יש לאתחל אותו.

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

2. הצהרה לעומת אתחול

נתחיל בלוודא שאנחנו באותו דף.

הצהרה היא תהליך הגדרת המשתנה יחד עם סוגו ושמו.

הנה, אנו מכריזים על תְעוּדַת זֶהוּת מִשְׁתַנֶה:

מזהה int;

לעומת זאת, אתחול הוא כל הקצאת ערך; לדוגמה:

id = 1;

כדי להדגים, ניצור א מִשׁתַמֵשׁ כיתה עם א שֵׁם ו תְעוּדַת זֶהוּת נכסים:

מחלקה ציבורית משתמש {שם פרטי מחרוזת; מזהה פרטי פרטי; // קונסטרוקטור סטנדרטי, גטררים, סטרים,}

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

3. אובייקטים לעומת פרימיטיבים

Java מספקת שני סוגים של ייצוג נתונים: סוגים פרימיטיביים וסוגי הפניה. בחלק זה נדון בהבדלים בין השניים ביחס לאתחול.

ל- Java שמונה סוגי נתונים מובנים, המכונים סוגים פרימיטיביים של Java; משתנים מסוג זה מחזיקים את ערכיהם ישירות.

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

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

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

בואו נסתכל על דוגמה שמצהירה ומאתחשת סוג ייחוס משלנו מִשׁתַמֵשׁ מעמד:

@ מבחן ציבורי בטל כאשרIntializedWithNew_thenInstanceIsNotNull () {משתמש משתמש = משתמש חדש (); assertThat (user) .isNotNull (); }

כפי שניתן לראות כאן, ניתן להקצות הפניה לחדש באמצעות מילת המפתח חָדָשׁ, שאחראית ליצירת החדש מִשׁתַמֵשׁ לְהִתְנַגֵד.

בואו נמשיך ללמוד עוד על יצירת אובייקטים.

5. יצירת אובייקטים

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

בואו נדון בבונים וב- חָדָשׁ מילת מפתח בפירוט נוסף.

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

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

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

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

בואו נוסיף קונסטרוקטור שלנו מִשׁתַמֵשׁ מעמד:

משתמש ציבורי (שם מחרוזת, int מזהה) {this.name = שם; this.id = id; }

כעת אנו יכולים להשתמש בבנאי שלנו כדי ליצור מִשׁתַמֵשׁ אובייקט עם ערכים ראשוניים לתכונותיו:

משתמש משתמש = משתמש חדש ("אליס", 1);

6. היקף משתנה

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

6.1. משתני מופע ומחלקה

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

עכשיו, בואו ננסה להגדיר משתנים מסוימים למופע ולכיתה ולבדוק אם יש להם ערך ברירת מחדל או לא:

@ מבחן ציבורי בטל כאשר ValuesAreNotInitialized_thenUserNameAndIdReturnDefault () {משתמש משתמש = משתמש חדש (); assertThat (user.getName ()). isNull (); assertThat (user.getId () == 0); }

6.2. משתנים מקומיים

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

לדוגמה, הקוד הבא מייצר שגיאת מהדר:

הדפסת חלל ציבורית () {int i; System.out.println (i); }

7. ה סופי מילת מפתח

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

בואו נוסיף קבוע לשלנו מִשׁתַמֵשׁ מעמד:

סופי סטטי פרטי פרטי YEAR = 2000;

יש לאתחל קבועים גם כאשר הם מוכרזים או בבנייה.

8. אתחול באתחול ב- Java

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

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

8.1. אתחול מופעים

אנו יכולים להשתמש בהם כדי לאתחל משתני מופעים.

כדי להדגים, בואו נספק ערך למשתמש תְעוּדַת זֶהוּת באמצעות אתחול מופע אצלנו מִשׁתַמֵשׁ מעמד:

{id = 0; }

8.2. חסם אתחול סטטי

אתחול סטטי או בלוק סטטי - הוא גוש קוד המשמש לאתחול סטָטִי שדות. במילים אחרות, זהו אתחול פשוט המסומן במילת המפתח סטָטִי:

פורום מחרוזות סטטי פרטי; סטטי {forum = "Java"; }

9. סדר האתחול

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

ב- Java, סדר הצהרות האתחול הוא כדלקמן:

  • משתנים סטטיים ומתחילים סטטיים לפי הסדר
  • משתני מופע ומתחילים למופע לפי הסדר
  • בונים

10. מחזור חיים של אובייקט

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

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

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

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

כדי שאובייקט ג'אווה יהיה בלתי נגיש, עליו להיתקל באחד מהמצבים הבאים:

  • לאובייקט אין עוד אזכורים המצביעים עליו
  • כל התייחסות המצביעה על האובייקט מחוץ לתחום

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

לבסוף, כשזה כבר לא נחוץ, אספן האשפה הורס אותו.

11. שיטות אחרות ליצירת אובייקטים

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

השתקפות היא מנגנון שנוכל להשתמש בו לבדיקת מחלקות, שדות ושיטות בזמן הריצה. הנה דוגמה ליצירת שלנו מִשׁתַמֵשׁ אובייקט באמצעות השתקפות:

@ מבחן פומבי בטל כאשרInitializedWithReflection_thenInstanceIsNotNull () זורק חריג {משתמש משתמש = User.class.getConstructor (String.class, int.class) .newInstance ("אליס", 2); assertThat (user) .isNotNull (); }

במקרה זה אנו משתמשים בבבואה כדי למצוא ולהפעיל קונסטרוקטור של ה- מִשׁתַמֵשׁ מעמד.

השיטה הבאה, שיבוט, היא דרך ליצור עותק מדויק של אובייקט. בשביל זה, שלנו מִשׁתַמֵשׁ המחלקה חייבת ליישם את ניתנת לשיבוט מִמְשָׁק:

מחלקה ציבורית מיישמת Cloneable {// ...}

עכשיו אנחנו יכולים להשתמש ב- שיבוט () שיטה ליצור חדש משתמש משובט אובייקט בעל ערכי מאפיינים זהים לזה מִשׁתַמֵשׁ לְהִתְנַגֵד:

@ מבחן ציבורי בטל כאשרCopiedWithClone_thenExactMatchIsCreated () זורק CloneNotSupportedException {משתמש משתמש = משתמש חדש ("אליס", 3); משתמש clonedUser = (משתמש) user.clone (); assertThat (clonedUser) .isEqualTo (user); }

אנחנו יכולים גם להשתמש ב- sun.misc. לא בטוח מחלקה להקצאת זיכרון לאובייקט מבלי להתקשר לבנאי:

משתמש u = (User) unsafeInstance.allocateInstance (User.class);

12. מסקנה

במדריך זה סקרנו אתחול שדות בג'אווה. גילינו סוגי נתונים שונים ב- Java וכיצד להשתמש בהם. בדקנו גם כמה דרכים ליצירת אובייקטים בג'אווה.

ניתן למצוא את היישום המלא של מדריך זה ב- Github.