logo

דוגמה ל-Java Copy Constructor

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

בַּנַאִי

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

סוגי קונסטרוקטורים

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

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

מדוע נדרש בנאי העתקה?

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

העתק קונסטרוקטור

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

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

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

שימוש ב-Copy Constructor

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

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

היתרונות של Copy Constructor

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

יצירת קופי קונסטרוקטור

כדי ליצור בנאי העתקה ב-Java, בצע את השלבים המפורטים להלן:

  • צור בנאי שמקבל אובייקט מאותה מחלקה כפרמטר.
 public class Fruits { private double price; private String name; //copy constructor public Fruits(Fruits fruits) { //getters } } 
  • העתק כל אובייקט שדה (משתנה) לתוך המופע החדש שנוצר.
 public class Fruits { private double price; private String name; //copy constructor public Fruits(Fruits fruits) { //copying each filed this.price = fruits.price; //getter this.name = fruits.name; //getter } } 

דוגמה ל-Copy Constructor

CopyConstructorExample.java

 public class Fruit { private double fprice; private String fname; //constructor to initialize roll number and name of the student Fruit(double fPrice, String fName) { fprice = fPrice; fname = fName; } //creating a copy constructor Fruit(Fruit fruit) { System.out.println('
After invoking the Copy Constructor:
'); fprice = fruit.fprice; fname = fruit.fname; } //creating a method that returns the price of the fruit double showPrice() { return fprice; } //creating a method that returns the name of the fruit String showName() { return fname; } //class to create student object and print roll number and name of the student public static void main(String args[]) { Fruit f1 = new Fruit(399, 'Ruby Roman Grapes'); System.out.println('Name of the first fruit: '+ f1.showName()); System.out.println('Price of the first fruit: '+ f1.showPrice()); //passing the parameters to the copy constructor Fruit f2 = new Fruit(f1); System.out.println('Name of the second fruit: '+ f2.showName()); System.out.println('Price of the second fruit: '+ f2.showPrice()); } } 

תְפוּקָה:

 Name of the first fruit: Ruby Roman Grapes Price of the first fruit: 399.0 After invoking the Copy Constructor: Name of the second fruit: Ruby Roman Grapes Price of the second fruit: 399.0 

העתק קונסטרוקטור לעומת שיטת clone()

גם בנאי העתק וגם שיטת clone() משמשים ליצירת עותק של אובייקט קיים של המחלקה. אבל השימוש בבנאי העתקה קל וטוב יותר בהשוואה לשיטת clone() בגלל הסיבות הבאות:

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