JavaRush /בלוג Java /Random-HE /מחלקות מקוננות סטטיות

מחלקות מקוננות סטטיות

פורסם בקבוצה
שלום! אנו ממשיכים לחקור את הנושא של מחלקות מקוננות בג'אווה. בשיעור האחרון דיברנו על מחלקות מקוננות לא סטטיות או, כפי שהן נקראות גם, מחלקות פנימיות. מחלקות מקוננות סטטיות - 2היום בואו נעבור לקבוצה אחרת ונסתכל מקרוב על מחלקות מקוננות סטטיות. מחלקות מקוננות סטטיות - 3במה הם שונים מקבוצות אחרות? כאשר מכריזים על מחלקה כזו, אנו משתמשים במילת המפתח הסטטית המוכרת כבר:
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       public static int getMaxPassengersCount() {

           return maxPassengersCount;
       }
   }
}
מחלקות מקוננות סטטיות - 4בדוגמה זו, יש לנו מחלקה חיצונית Boeing737שיוצרת מטוס מדגם זה. ויש לו קונסטרוקטור עם פרמטר אחד: שנת ייצור ( int manufactureYear). יש גם משתנה סטטי אחד int maxPassengersCount- המספר המרבי של נוסעים. זה יהיה זהה עבור כל המטוסים מאותו דגם, אז אנחנו צריכים רק עותק אחד. בנוסף, יש לו מחלקה פנימית סטטית Drawing- תוכנית מטוס. במחלקה זו נוכל לכלול את כל מידע השירות על המטוס. בדוגמה שלנו, לשם הפשטות, הגבלנו אותו לשנת הייצור, אך הוא יכול להכיל מידע רב אחר. מחלקות מקוננות סטטיות - 5כפי שדיברנו בהרצאה האחרונה, יצירת מחלקה מקוננת כזו מגבירה את האנקפסולציה ומקדמת הפשטה מציאותית יותר. מה ההבדל בין מחלקות מקוננות סטטיות ולא סטטיות? 1. אובייקט מחלקה סטטי Drawingאינו מאחסן הפניה למופע ספציפי של המחלקה החיצונית. זכור את הדוגמה מההרצאה האחרונה עם אופניים:
public class Bicycle {

   private String model;
   private int mawWeight;

   public Bicycle(String model, int mawWeight) {
       this.model = model;
       this.mawWeight = mawWeight;
   }

   public void start() {
       System.out.println("Go!");
   }

   public class SteeringWheel {

       public void right() {
           System.out.println("Steering wheel to the right!");
       }

       public void left() {

           System.out.println("Steering wheel to the left!");
       }
   }

}
שם דיברנו על איך SteeringWheelהפניה לאובייקט של המעמד החיצוני (אופניים) מועברת לכל מופע של המעמד הפנימי (ההגה) מבלי שנשים לב Bicycle. ללא אובייקט של המעמד החיצוני, אובייקט של המעמד הפנימי פשוט לא יכול להתקיים. זה לא נכון עבור מחלקות מקוננות סטטיות. אובייקט של מחלקה מקוננת סטטית יכול להתקיים בקלות בפני עצמו. בהקשר זה, מחלקות סטטיות הן "עצמאיות" יותר ממעמדות לא סטטיים. הנקודה היחידה היא שכאשר יוצרים אובייקט כזה אתה צריך לציין את שם המחלקה החיצונית:
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
למה הפכנו את השיעור Drawingלסטטי, אבל בהרצאה האחרונה השיעור Seat(כיסא האופניים) לא היה סטטי? כמו בפעם הקודמת, בואו נוסיף קצת "פילוסופיה" כדי להבין את הדוגמה :) בניגוד למושב אופניים, מהות הציור לא קשורה כל כך חזק למהות המטוס. חפץ מושב נפרד, ללא אופניים, לרוב יהיה חסר משמעות (אם כי לא תמיד – דיברנו על זה בשיעור האחרון). מהות הציור הגיונית בפני עצמה. לדוגמה, זה עשוי להיות שימושי למהנדסים המתכננים תיקוני מטוסים. הם לא צריכים את המטוס עצמו לתכנון, והם יכולים להיות ממוקמים בכל מקום - מספיק רק ציור. בנוסף, עבור כל המטוסים מאותו דגם, הציור עדיין יהיה זהה, כך שאין חיבור קשיח כמו מושב עם אופניים. לכן, האובייקט Drawingאינו זקוק לקישור לאובייקט מטוס ספציפי. 2. גישה שונה למשתנים ושיטות של מחלקה חיצונית. מחלקה מקוננת סטטית יכולה לגשת רק לשדות סטטיים של המחלקה החיצונית. בדוגמה שלנו, למחלקה Drawingיש שיטה getMaxPassengersCount()שמחזירה את הערך של משתנה סטטי maxPassengersCountממחלקה חיצונית. עם זאת, איננו יכולים ליצור שיטה getManufactureYear()כדי Drawingלהחזיר ערך manufactureYear. אחרי הכל, משתנה manufactureYearאינו סטטי, מה שאומר שהוא חייב להיות שייך למופע מסוים Boeing737. וכפי שכבר גילינו, במקרה של מחלקות מקוננות סטטיות, האובייקט של המחלקה החיצונית יכול בקלות להיות חסר. מכאן המגבלה :) לא משנה איזה גישה יש למשתנה הסטטי במחלקה החיצונית. גם אם זה private, עדיין תהיה גישה ממחלקה מקוננת סטטית. כל האמור לעיל נוגע לא רק לגישה למשתנים סטטיים, אלא גם לשיטות סטטיות. חָשׁוּב! המילה staticבהצהרת מחלקה פנימית אינה אומרת שניתן ליצור רק אובייקט אחד. אל תבלבל בין אובייקטים למשתנים. אם אנחנו מדברים על משתנים סטטיים, כן, משתנה מחלקה סטטי, למשל, maxPassangersCountקיים בעותק בודד. אבל כאשר מוחל על מחלקה מקוננת, staticזה רק אומר שהאובייקטים שלה אינם מכילים הפניות לאובייקטים של המחלקה החיצונית. ואנחנו יכולים ליצור כמה אובייקטים שאנחנו רוצים:
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       private int id;

       public Drawing(int id) {
           this.id = id;
       }

       public static int getPassengersCount() {

           return maxPassengersCount;
       }

       @Override
       public String toString() {
           return "Drawing{" +
                   "id=" + id +
                   '}';
       }

       public static void main(String[] args) {

           for (int i = 1; i < 6; i++) {

               Boeing737.Drawing drawing = new Boeing737.Drawing(i);
               System.out.println(drawing);
           }
       }
   }
}
הכרזנו על השיטה main()ישירות במחלקה המקוננת (אין סיבה מיוחדת לכך - רק שתדע שזה אפשרי), ויצרנו 5 אובייקטים Drawing. למרות העובדה שאין לנו אובייקט אחד של מחלקה חיצונית. כפי שאתה יכול לראות, לא היו בעיות :) פלט מסוף:

Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
זה מסיים את השיעור שלנו! ליתר בטחון, אשאיר לך קישור לקטע עליהם בתיעוד של אורקל . קרא אותו אם יש נקודות לא ברורות. עכשיו הגיע הזמן לפתור כמה בעיות! :)
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION