CodeGym /בלוג Java /Random-HE /רצף פעולות במהלך יצירת אובייקט
John Squirrels
רָמָה
San Francisco

רצף פעולות במהלך יצירת אובייקט

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

Cat cat = new Cat();
דיברנו על זה בעבר, אבל למקרה שנזכיר לך:
  • ראשית, זיכרון לאחסון האובייקט מוקצה.
  • לאחר מכן, מכונת ה-Java יוצרת הפניה לאובייקט (במקרה שלנו ההתייחסות היא Cat cat).
  • לבסוף, משתנים מאותחלים והקונסטרוקטור נקרא (אנחנו הולכים להסתכל על תהליך זה ביתר פירוט).
בנוסף, מהשיעור על מחזור החיים של האובייקט , אתה בוודאי זוכר שאובייקט מחזיק מעמד כל עוד יש לו התייחסות אחת לפחות. אם לא נשארו כאלה, החפץ הופך לטרף של אספן האשפה. רצף פעולות במהלך יצירת אובייקט - 2שתי הנקודות הראשונות הללו אינן אמורות לעורר שאלות מיוחדות. הקצאת זיכרון היא תהליך פשוט, ויש רק שתי תוצאות אפשריות: או שיש זיכרון או שאין :) ויצירת קישור אינה יוצאת דופן. אבל הנקודה השלישית מייצגת מערך שלם של פעולות המבוצעות בסדר קפדני. אני לא חובב לדחוס לבדיקות, אבל אתה צריך להבין את התהליך הזה היטב ואתה צריך לשנן את רצף הפעולות הזה . כשדיברנו על תהליך יצירת האובייקט בשיעורים קודמים, עדיין לא ממש ידעתם שום דבר על ירושה, אז להסביר כמה דברים היה בעייתי. עכשיו אתה יודע די הרבה וסוף סוף נוכל לשקול את השאלה הזו במלואה :) אז הנקודה השלישית אומרת " סוף סוף, משתנים מאותחלים והקונסטרוקטור נקרא. " אבל באיזה סדר כל זה קורה? להבנה טובה יותר, בואו ניצור שני כיתות פשוטות במיוחד - הורה וילד:

public class Vehicle { 

   public static int vehicleCounter = 0; 

   private String description = "Vehicle"; 
   public Vehicle() { 
   } 

   public String getDescription() { 
       return description; 
   } 
} 

public class Truck extends Vehicle { 

   private static int truckCounter = 0; 

   private int yearOfManufacture; 
   private String model; 
   private int maxSpeed; 

   public Truck(int yearOfManufacture, String model, int maxSpeed) { 
       this.yearOfManufacture = yearOfManufacture; 
       this.model = model; 
       this.maxSpeed = maxSpeed; 

       Vehicle.vehicleCounter++; 
       truckCounter++; 
   } 
}
המחלקה Truckהיא יישום של משאית עם שדות המייצגים את השנה, הדגם והמהירות המרבית שלה. כעת אנו רוצים ליצור אובייקט אחד כזה:

public class Main { 

   public static void main(String[] args) throws IOException { 

       Truck truck = new Truck(2017, "Scania S 500 4x2", 220); 
   } 
}
למכונת Java, התהליך ייראה כך:
  1. הדבר הראשון שקורה הוא שהמשתנים הסטטיים של Vehicleהמחלקה מאותחלים . כן, אמרתי בכיתה Vehicle, לא Truck. משתנים סטטיים מאותחלים לפני קריאה של בנאים, וזה מתחיל במחלקת האב. בואו ננסה לאמת זאת. אנחנו מגדירים את vehicleCounterהשדה במחלקה Vehicleשווה ל-10 ומנסים להציג אותו גם בבנאים Vehicleוגם Truck.

    
    public class Vehicle { 
    
       public static int vehicleCounter = 10; 
       private String description = "Vehicle"; 
    
       public Vehicle() { 
           System.out.println(vehicleCounter); 
       } 
    
       public String getDescription() { 
           return description; 
       } 
    } 
    
    public class Truck extends Vehicle { 
    
       private static int truckCount = 0;
    
       private int yearOfManufacture; 
       private String model; 
       private int maxSpeed; 
    
       public Truck(int yearOfManufacture, String model, int maxSpeed) { 
           System.out.println(vehicleCounter); 
           this.yearOfManufacture = yearOfManufacture; 
           this.model = model; 
           this.maxSpeed = maxSpeed; 
    
           Vehicle.vehicleCounter++; 
           truckCount++; 
       } 
    }

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

    והנה התוצאה:

    
    10 
    10
  2. לאחר אתחול המשתנים הסטטיים של מחלקת האב, אתחול המשתנים הסטטיים של מחלקת הילד. במקרה שלנו זה התחום truckCounterשל Truckהכיתה.

    בואו נעשה ניסוי נוסף שבו ננסה להציג את הערך של truckCounterבתוך Truckהבנאי לפני אתחול השדות האחרים:

    
    public class Truck extends Vehicle { 
    
       private static int truckCounter = 10; 
    
       private int yearOfManufacture; 
       private String model; 
       private int maxSpeed; 
    
       public Truck(int yearOfManufacture, String model, int maxSpeed) { 
           System.out.println(truckCounter); 
           this.yearOfManufacture = yearOfManufacture; 
           this.model = model; 
           this.maxSpeed = maxSpeed; 
    
           Vehicle.vehicleCounter++; 
           truckCounter++; 
       } 
    }

    כפי שאתה יכול לראות, הערך 10 כבר הוקצה למשתנה הסטטי שלנו כאשר Truckהבנאי מתחיל.

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

    כניסוי, אנו יכולים להקצות ערך ראשוני כלשהו למשתנה descriptionבכיתה Vehicle, ולאחר מכן לשנות אותו בבנאי.

    
    public class Vehicle { 
    
       public static int vehicleCounter = 10; 
    
       private String description = "Initial value of the description field"; 
    
       public Vehicle() { 
           System.out.println(description); 
           description = "Vehicle"; 
           System.out.println(description); 
       } 
    
       public String getDescription() { 
           return description; 
       } 
    }

    בואו נריץ את main()השיטה שלנו שיוצרת משאית:

    
    public class Main { 
    
       public static void main(String[] args) throws IOException { 
    
           Truck truck = new Truck(2017, "Scania S 500 4x2", 220); 
       } 
    }

    אנו מקבלים את התוצאה הבאה:

    
    Initial value of the description field 
    Vehicle

    זה מוכיח שכאשר Vehicleהבנאי מתחיל descriptionלשדה כבר הוקצה ערך.

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

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

    
    public Vehicle() { 
    
       System.out.println("Hello from the Vehicle constructor!"); 
    } 
    
    public Truck(int yearOfManufacture, String model, int maxSpeed) { 
    
       System.out.println("Hello from the Truck constructor!"); 
       this.yearOfManufacture = yearOfManufacture; 
       this.model = model; 
       this.maxSpeed = maxSpeed; 
    
       Vehicle.vehicleCounter++; 
       truckCounter++; 
    }

    נריץ את main()השיטה שלנו ונסתכל על התוצאה:

    
    Hello from the Vehicle constructor! 
    Hello from the Truck constructor!

    מְעוּלֶה. זה אומר שאנחנו לא טועים :) בואו נמשיך הלאה.

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

    
    public class Truck extends Vehicle { 
    
       private static int truckCounter = 10; 
    
       private int yearOfManufacture; 
       private String model; 
       private int maxSpeed = 150; 
    
       public Truck(int yearOfManufacture, String model, int maxSpeed) { 
    
           System.out.println("Initial value of maxSpeed = " + this.maxSpeed); 
           this.yearOfManufacture = yearOfManufacture; 
           this.model = model; 
           this.maxSpeed = maxSpeed; 
    
           Vehicle.vehicleCounter++; 
           truckCounter++; 
       } 
    }

    פלט מסוף:

    
    Initial value of maxSpeed = 150

    כפי שאתה יכול לראות,  כאשר Truck הקונסטרוקטור מתחיל, maxSpeed זה כבר שווה ל-150!

  6. הקונסטרוקטור של Truckכיתת הילד נקרא.

    ורק בשלב זה, אחרון מכולם, ייקרא הבנאי של המחלקה שאנו מייצרים!

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

    כפי שניתן לראות, "בניית" משאית, כלומר תהליך יצירת האובייקט, אינו פשוט. אבל נראה שפירקנו את זה לחלקים הכי קטנים :)

רצף פעולות במהלך יצירת אובייקט - 3 למה כל כך חשוב להבין את התהליך הזה היטב? תארו לעצמכם כמה בלתי צפויות יכולות להיות התוצאות של יצירת חפץ רגיל אם לא הייתם יודעים בדיוק מה קורה "מתחת למכסה המנוע" :) עכשיו הגיע הזמן לחזור לקורס ולהשלים כמה משימות! בהצלחה ולהתראות בקרוב! :)
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION