JavaRush /בלוג Java /Random-HE /התייחסות לסוגי נתונים ב-Java

התייחסות לסוגי נתונים ב-Java

פורסם בקבוצה
בלי להבין את תחביר ג'אווה, אי אפשר להפוך למפתח רציני, אז היום אנחנו ממשיכים ללמוד את התחביר. באחד המאמרים הקודמים דיברנו על משתנים פרימיטיביים, אך מכיוון שישנם שני סוגי משתנים, היום נדבר על הסוג השני – טיפוסי התייחסות בג'אווה. אז מה זה? מדוע נדרשים סוגי נתוני עזר ב-Java? התייחסות לסוגי נתונים ב-Java - 1בואו נדמיין שיש לנו אובייקט טלוויזיה עם כמה מאפיינים, כמו מספר ערוץ, עוצמת קול ודגל:
public class TV {
   int numberOfChannel;
   int soundVolume;
   boolean isOn;
}
איך סוג פשוט כמו , יכול intלאחסן את הנתונים האלה? בואו נזכור: משתנה אחד intהוא 4 בתים. אבל בפנים יש שני משתנים (4 בתים + 4 בתים) מאותו סוג, וגם boolean(+1 בתים)... סך הכל - 4 עד 9, אבל ככלל, הרבה יותר מידע מאוחסן באובייקט. מה לעשות? אתה לא יכול להכניס אובייקט למשתנה. בשלב זה בסיפור שלנו, משתני התייחסות מופיעים. משתני התייחסות מאחסנים את הכתובת של מיקום הזיכרון שבו נמצא אובייקט ספציפי. כלומר, מדובר ב"כרטיס ביקור" עם כתובת, שבאמצעותו נוכל למצוא את האובייקט שלנו בזיכרון המשותף ולבצע איתו כמה מניפולציות. הפניה לכל אובייקט ב-Java היא משתנה התייחסות. כך זה ייראה עם אובייקט הטלוויזיה שלנו:
TV telly = new TV();
הגדרנו משתנה מסוג TV עם שם tellyלקישור לאובייקט שנוצר מסוג TV. כלומר, ה-JVM מקצה זיכרון על הערימה עבור אובייקט הטלוויזיה, יוצר אותו ואת הכתובת למיקומו בזיכרון, מכניס אותו למשתנה telly, אשר מאוחסן בערימה. אתה יכול לקרוא עוד על זיכרון, כלומר המחסנית והרבה מידע שימושי אחר, בהרצאה זו . משתנה מסוג TV ואובייקט מסוג TV, שמתם לב? זה לא בכדי: אובייקטים מסוג מסוים חייבים להיות בעלי משתנים מתאימים מאותו סוג (לא סופרים את ההטמעות של ירושה וממשק, אבל עכשיו אנחנו לא לוקחים את זה בחשבון). אחרי הכל, אנחנו לא הולכים למזוג מרק לכוסות, נכון? מסתבר שהאובייקט שלנו הוא טלוויזיה, ומשתנה הייחוס עבורו הוא כמו לוח בקרה. באמצעות שלט רחוק זה נוכל ליצור אינטראקציה עם האובייקט שלנו והנתונים שלו. לדוגמה, הגדר את המאפיינים עבור הטלוויזיה שלנו:
telly.isOn = true;
telly.numberOfChannel = 53;
telly.soundVolume = 20;
כאן השתמשנו באופרטור הנקודה .כדי לגשת ולהתחיל להשתמש באלמנטים הפנימיים של האובייקט שאליו המשתנה מתייחס. לדוגמה, בשורה הראשונה אמרנו למשתנה telly: "תן לנו משתנה פנימי isOnשל האובייקט שאליו אתה מתייחס והגדר אותו כ-true" (תדליק לנו את הטלוויזיה).

הגדרה מחדש של משתני התייחסות

נניח שיש לנו שני משתנים מסוג הפניה והאובייקטים שהם מתייחסים אליהם:
TV firstTV = new TV();
TV secondTV = new TV();
אם נכתוב:
firstTV = secondTV;
זה אומר שהקצנו למשתנה הראשון כערך עותק של הכתובת (ערך סיביות הכתובת) לאובייקט השני, וכעת שני המשתנים מתייחסים לאובייקט השני (במילים אחרות, שני שלטים רחוקים לאותו אובייקט טֵלֶוִיזִיָה). יחד עם זאת, האובייקט הראשון נותר ללא משתנה המתייחס אליו. כתוצאה מכך, יש לנו אובייקט שלא ניתן לגשת אליו, כי המשתנה היה חוט כל כך מותנה לו, שבלעדיו הוא הופך לזבל, פשוט שוכב בזיכרון ותופס מקום. חפץ זה יושמד לאחר מכן מהזיכרון על ידי אספן האשפה . התייחסות לסוגי נתונים ב-Java - 2אתה יכול לשבור את החוט המחבר עם אובייקט ללא קישור נוסף:
secondTV = null;
כתוצאה מכך, יהיה רק ​​קישור אחד לאובייקט - firstTV, secondTVולא יפנה יותר לאף אחד (מה שלא מונע מאיתנו להקצות לו קישור לאובייקט כלשהו כמו טלוויזיה בעתיד).

שיעור מיתר

בנפרד, ברצוני להזכיר את מחלקה String . זוהי מחלקה בסיס המיועדת לאחסון ועבודה עם נתונים המאוחסנים כמחרוזת. דוגמא:
String text = new String("This TV is very loud");
כאן העברנו מחרוזת שתהיה מאוחסנת בקונסטרוקטור של האובייקט. אבל אף אחד לא עושה את זה. אחרי הכל, ניתן ליצור מחרוזות:
String text = "This TV is very loud";
הרבה יותר נוח, נכון? מבחינת פופולריות השימוש, Stringהוא לא נחות מטיפוסים פרימיטיביים, אבל הוא עדיין מחלקה, והמשתנה שמתייחס אליו אינו טיפוס פרימיטיבי, אלא טיפוס התייחסות. יש לנו Stringאת היכולת הנפלאה הזו לשרשר מחרוזות:
String text = "This TV" + " is very loud";
כתוצאה מכך, נקבל שוב את הטקסט: This TV is very loud, מכיוון ששתי השורות ישולבו לכדי שלם אחד, והמשתנה יפנה לטקסט המלא הזה. ניואנס חשוב הוא שמדובר Stringבמעמד בלתי משתנה. מה זה אומר? ניקח את הדוגמה הזו:
String text = "This TV";
text = text + " is very loud";
נראה שהכל פשוט: אנו מכריזים על משתנה, נותנים לו ערך. בשורה הבאה נשנה אותו. אבל אנחנו לא באמת משתנים. מכיוון שמדובר במחלקה בלתי ניתנת לשינוי, בשורה השנייה הערך ההתחלתי אינו משתנה, אלא נוצר אחד חדש, אשר בתורו מורכב מהראשון + " is very loud".

קבועי התייחסות

במאמר על טיפוסים פרימיטיביים נגענו בנושא הקבועים. כיצד יתנהג משתנה התייחסות כשנכריז עליו כסופי ?
final TV telly = new TV();
אתה עשוי לחשוב שזה יהפוך את האובייקט לבלתי ניתן לשינוי. אבל לא, זה לא נכון. התייחסות לסוגי נתונים ב-Java - 3משתנה התייחסות עם משתנה finalיהיה קשור לאובייקט ספציפי ללא יכולת לבטל אותו בשום אופן (להגדיר אותו מחדש או להשוות אותו ל null). כלומר, לאחר הגדרת הערך של משתנה כזה, קוד כמו:
telly = new TV();
אוֹ
telly = null;
יגרום לשגיאת קומפילציה. כלומר, finalהוא פועל רק על הקישור, ואין לו השפעה על האובייקט עצמו. אם בהתחלה יש לנו את זה ניתן לשינוי, נוכל לשנות את המצב הפנימי שלו ללא בעיות:
telly.soundVolume = 30;
לפעמים, משתנים מוגדרים כסופיים אפילו בטיעוני שיטה!
public void enableTV (final TV telly){
   telly.isOn = true;
}
זה נעשה כדי שבמהלך תהליך כתיבת שיטה לא ניתן לעקוף את הטיעונים הללו, ובהתאם, ליצור פחות בלבול. מה אם נציין finalמשתנה ייחוס המתייחס לאובייקט בלתי ניתן לשינוי? למשל String:
final String PASSWORD = "password";
כתוצאה מכך, נקבל קבוע, אנלוגי של קבועים מסוג פרימיטיבי, כי כאן לא נוכל להגדיר מחדש את ההתייחסות ולא לשנות את המצב הפנימי של האובייקט (נתונים פנימיים).

בואו נסכם את זה

  1. בעוד שמשתנים פשוטים מאחסנים סיביות ערך, משתני התייחסות מאחסנים סיביות המייצגות את האופן שבו אובייקט מאוחזר.
  2. הפניות לאובייקט מוצהרות רק עבור סוג אחד של אובייקט.
  3. כל מחלקה ב-Java היא סוג הפניה.
  4. ערך ברירת המחדל של כל משתנה ייחוס ב-Java הוא null.
  5. Stringהוא דוגמה סטנדרטית לסוג הפניה. גם מחלקה זו אינה ניתנת לשינוי.
  6. משתני התייחסות עם משנה קשורים finalלאובייקט אחד בלבד ללא אפשרות הגדרה מחדש.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION