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

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, התהליך ייראה כך:
-
הדבר הראשון שקורה הוא שהמשתנים הסטטיים של
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
-
לאחר אתחול המשתנים הסטטיים של מחלקת האב, אתחול המשתנים הסטטיים של מחלקת הילד. במקרה שלנו זה התחום
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
הבנאי מתחיל. -
עדיין לא הגיע הזמן לבנאים! אתחול המשתנים נמשך. המשתנים הלא סטטיים של מחלקת האב מאותחלים שלישית. כפי שאתה יכול לראות, תורשה מסבכת באופן משמעותי את תהליך יצירת האובייקט, אבל אין שום דבר שאתה יכול לעשות בקשר לזה: אתה רק צריך לשנן כמה דברים בתכנות :)
כניסוי, אנו יכולים להקצות ערך ראשוני כלשהו למשתנה
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
לשדה כבר הוקצה ערך. -
סוף סוף, הגיע הזמן לבנאים! ליתר דיוק, הגיע הזמן לבנאי מחלקות הבסיס. הוא מופעל בשלב הרביעי של תהליך יצירת האובייקט.
זה גם די קל לאמת. בואו ננסה להוציא שתי שורות לקונסולה: אחת בתוך
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!
מְעוּלֶה. זה אומר שאנחנו לא טועים :) בואו נמשיך הלאה.
-
עכשיו הגיע הזמן לאתחול של השדות הלא סטטיים של כיתת הילד, כלומר
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! -
הקונסטרוקטור של
Truck
כיתת הילד נקרא.ורק בשלב זה, אחרון מכולם, ייקרא הבנאי של המחלקה שאנו מייצרים!
רק בשלב השישי יוקצו לשדות את הערכים שאנו מעבירים כטיעונים למשאית שלנו.
כפי שניתן לראות, "בניית" משאית, כלומר תהליך יצירת האובייקט, אינו פשוט. אבל נראה שפירקנו את זה לחלקים הכי קטנים :)

GO TO FULL VERSION