JavaRush /בלוג Java /Random-HE /הפסקת קפה מס' 123. Java Constructor - שאלות ותשובות בראיו...

הפסקת קפה מס' 123. Java Constructor - שאלות ותשובות בראיון טכני

פורסם בקבוצה
מקור: Hackenoon

מה זה קונסטרוקטור?

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

למה צריך בנאים? הסבר בפירוט

נניח שיש לנו כיתה בשם Student . ויש לנו את שם משתנה המופע ו- roll_number .
class Student{
String name;
int rollNo;
}
כעת, אם ניצור 1000 אובייקטים, ה-JVM יאתחל את הערכים הללו עם סוג ברירת המחדל שלו Name = null ו- rollNo = 0 . זיהוי אובייקטים בודדים אלו אינו אפשרי, והקצאת ערכים לכל אחד מהאובייקטים תגדיל את כמות הקוד, מה שנחשב לתרגול תכנות גרוע. לכן, כדי להימנע מכך, משתמשים בבנאים. כלומר, המטרה של בנאי ב-Java היא לאתחל את הערך של משתני מופע מחלקה.

אילו סוגי בנאים קיימים בג'אווה?

ישנם שלושה סוגים שונים של בנאים ב-Java:
  • ברירת המחדל של קונסטרוקטור
  • בנאי ללא ויכוח
  • קונסטרוקטור בעל פרמטרים

מה זה Default Constructor ב-Java?

קונסטרוקטור ברירת מחדל הוא בנאי שנוצר על ידי ה-JVM בזמן ריצה אם לא מוגדר בנאי במחלקה. התפקיד העיקרי של בנאי ברירת המחדל הוא לאתחל את ערכי המופעים בהתאם לסוג ברירת המחדל שלהם. דוגמה לבנאי ברירת מחדל ב-Java:
class DefaultConstructor{
int id;
String name;
}
כעת עבור המחלקה הזו, אם ניצור אובייקט, אז בתוך ה-JVM יהיה בנאי ברירת מחדל אשר ניתן לו ערך ברירת מחדל.
DefaultConstructor df= new DefaultConstructor();
עכשיו אם נדפיס את הערך נקבל:
Print = df.id = 0.df.name = null.

מהו קונסטרוקטור ללא ויכוח?

בנאי ללא טיעון הוא בנאי שניתן להגדיר במפורש כדי לאתחל את הערך של מופעים. לדוגמה:
class NoArgConstuctor{ int a; int b;

//No Argument Constructor
NoArgConstuctor(){
a = 10;
b = 20;
}

}

מהו קונסטרוקטור בעל פרמטרים?

בנאי בעל פרמטר הוא בנאי שמקבל פרמטר לאתחול מופעים. לדוגמה:
class ParameterizedConstuctor{
String name;
int age;
//Parameterized Constructor
ParameterizedConstuctor(String name, int age){
this.name = name;
this.age = age;
}
}

מהם הכללים להגדרת קונסטרוקטור?

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

  • לא אמור להיות סוג החזרה של בנאי ב-Java.

  • השינויים הרלוונטיים היחידים עבור בנאים הם:

    • פּוּמְבֵּי
    • בְּרִירַת מֶחדָל
    • מוּגָן
    • פְּרָטִי
  • בונים יכולים לקחת כל מספר של פרמטרים.

  • המשנים סופיים, מסונכרנים, סטטיים ומופשטים אינם מותרים בבנאי.

  • הבנאי אינו תומך בהצהרת החזרה בתוך הגוף שלו.

  • יכולים להיות חריגים עם הצהרת throw בקונסטרוקטור .

  • מקובל להשתמש בסעיף זריקה עם בנאי.

  • הבנאי לא אמור ליצור רקורסיה.

מתי נוכל להשתמש בבנאי פרטי?

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

מה יהיה ברירת המחדל של שינוי הגישה של הבנאי אם לא נגדיר אותו במפורש?

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

כתוב את הפלט של קטע הקוד שלהלן והסביר

class InterviewBit{
InterviewBit(){
System.out.println(" Welcome to InterviewBit ");
}
}
class ScalerAcademy extends InterviewBit{
ScalerAcademy(){
System.out.println(" Welcome to Scaler Academy by InterviewBit");
}
}
class Main{
public static void main(String[] args) {
ScalerAcademy sc = new ScalerAcademy();
}
}
הקוד לעיל יודפס:
ברוכים הבאים ל-InterviewBit. ברוכים הבאים ל-Scaler Academy מאת InterviewBit.
נקבל את הפלט הזה כי אם לא נכלול את מילת המפתח super() או this() בבנאי בשורה הראשונה, ה-JVM יכניס אותה אוטומטית בזמן ריצה. ה-JVM עושה זאת מכיוון שהוא יורש ממחלקה אחרת והפונקציונליות שלו תיושם גם במחלקה הנגזרת. לפיכך, בעת הקצאת ערכי ברירת מחדל למופעי מחלקות בסיס, ה-JVM מוסיף את מילת המפתח super() כברירת מחדל .

עיין בקוד וציין אם הוא חוקי או לא חוקי. הסבר את הסיבה

class InterviewBit{
InterviewBit(){
System.out.println(" Welcome to InterviewBit ");
}
}
class ScalerAcademy extends InterviewBit{
ScalerAcademy(){
this();
System.out.println(" Welcome to Scaler Academy by InterviewBit");
}
}
class Main{
public static void main(String[] args) {
ScalerAcademy sc = new ScalerAcademy();
}
}
הקוד שלמעלה אינו חוקי מכיוון שהוא אותו בנאי בתוך הבנאי Scaler Academy . זה יוצר רקורסיה בקונסטרוקטור, שאינה מותרת. בהתאם לכך, נקבל שגיאת זמן קומפילציה הקשורה לקריאה לבנאי הרקורסי.

האם נוכל להשתמש בשני בנאים במחלקה אחת בג'אווה?

כן, אנו יכולים להשתמש בכל מספר של בנאים במחלקה אחת, בכפוף לשני תנאים:
  • הפרמטרים של הבנאי חייבים להיות שונים.
  • לא אמורה להיות רקורסיה בבנאי.
דוגמא. שקול שני בנאים מאותה מחלקה InterviewBit :
InterviewBit(){
    this("Scaler"); // Calling parameterized constructor
    System.out.println(" No Argument Constructor");
}
InterviewBit(String name){
    this(); // Calling no-arg constructor
    System.out.println(" Constructor with Parameters.");
}
קוד זה אינו חוקי מכיוון שהוא יוצר רקורסיה. בנאי ללא ארגומנטים יקרא לבנאי עם פרמטרים, ובנאי עם פרמטרים יקרא לבנאי ללא ארגומנטים.

האם נוכל לעקוף בנאי ב-Java?

לא, הרעיון של עומס יתר של בנאים אינו ישים ב-Java.

האם בנאי יכול להיות סופי ב-Java?

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

האם בנאי יכול להיות סטטי ב-Java?

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

תאר את ההבדל בין סופר(), סופר וזו(), זה

super() וזה () הן קריאות בנאי. הוא משמש רק כדי לקרוא לבנאי של מחלקת האב או המחלקה הנוכחית. שים לב ש"סופר" ו"זה" הן מילות מפתח המשמשות לציון חברים של מופע של מחלקה משלו או מחלקה בסיס. שקול את הקוד שלהלן:
class InterviewBit{
    String message = " Welcome to InterviewBit";
}
public class Scaler extends InterviewBit
{
    String message = " Welcome to Scaler Academy";
    public void printMethod(){
        //this will print the message variable of the current class.
        System.out.println(this.message);

        //this will print the message variable of Base class.
        System.out.println(super.message);
    }
	public static void main(String[] args) {
		Scaler sa = new Scaler();
		sa.printMethod();
	}
}
בקטע הקוד הזה, this.message ידפיס את ההודעה " ברוכים הבאים ל-Scaler Academy " ו- super.message ידפיס את " ברוכים הבאים ל-InterviewBit ". כך נעשה שימוש בשתי מילות המפתח הללו כדי להתייחס למופעי חבר של המחלקות הבסיסיות והנגזרות.

מה זה משמידים? האם קיים הרס ב-Java?

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

מה זה שרשור בנאים ב-Java?

כאשר בנאי אחד נקרא מבנאי אחר, ניתן לקרוא לזה שרשור בנאי. קריאת הבנאי לא חייבת להתבצע על אותה מחלקה. ניתן לעשות זאת גם עבור כיתת ההורים. לדוגמא, שקול את התמונה למטה. הפסקת קפה מס' 123.  Java Constructor - שאלות ותשובות בראיון טכני - 2לאחר מכן, נוכל להסתכל על הקוד כדי לאתחל את האובייקט עם ערכי הערך של משתני המופע הבאים:
class EmployeeAddess{
    int pinCode;
    String address;
    String mobNo;
    EmployeeAddress(int pinCode, String address, String mobNo){
        this.pinCode = pinCodel
        this.address = address;
        this.mobNo = mobNo;
    }
}
class Employees extends EmployeeAddress{
    int ID;
    String name;
    String designation;
    String department;
    Employee(int ID, String name, String designation,String department,
                    int pinCode, String address, String mobNo){

        //Calling Constructor for Base class to initialize the object.
        //This can be a constructor chaining.
        super(pinCode, address, mobNo);
        this.ID = ID;
        this.name = name;
        this.designation = designation;
        this.department = department;
    }
}
public class Main{
    Employee emp = new Employee(101, "XYX", "SDE", "Cloud", 123456, "no 150, xys, xys, INDIA", "999999999");
}
בקוד לעיל, אנו יוצרים אובייקט Employee class עם פרטי העובד והכתובת שלו. מחלקת כתובת העובד עוברת בירושה למחלקת העובד . כעת, כדי ליצור מופע של ערך אובייקט עבור כתובת, אנחנו לא מקצים ערך מפורש לכתובת של העובד. במקום זאת, אנו משתמשים בבנאי של מחלקת כתובת העובד כדי לעשות זאת . ובעזרת סופר(טיעונים) אנו יוצרים שרשרת של בנאים כדי לאתחל את הערכים. זו מהי שרשרת קונסטרוקטורים.

קבע את פלט התוכנית מהקוד והסבר את תשובתך.

class InterviewBit{
void InterviewBit(){
System.out.println(" Java Constructor interview questions by InterviewBit");
}
int InterviewBit(int val){
System.out.println(" Java Constructor. And Value = "+val);
}
}
public class Main{
InterviewBit ib1 = new InterviewBit();
InterviewBit ib2 = new InterviewBit();
}
הקוד שלמעלה לא ידפיס שום דבר כי InterviewBit() אינו בנאי כאן. מכיוון שמשתמשים במילות המפתח Void ו- int , היא הופכת לשיטה. לכן אנחנו לא קוראים לשיטה. לא נקבל שום פלט כי כדי לבצע את השיטה אנחנו צריכים לקרוא לה במפורש על האובייקט.

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

class Rectangle{
    int length;
    int breadth;
    Rectangle(int length, int breadth){
        this.length = length;
        this.breadth = breadth;
    }

    //Overloaded Constructor for copying the value of old Object to new object
    Rectangle(Rectangle obj){
        this.length = obj.length;
        this.breadth = obj.breadth;
    }
}
public class Main{
    Rectangle obj1 = new Rectangle(10, 5);

    //New Object of rectangle class will be created with the value from obj1.
    Rectangle obj2 = new Rectangle(obj1);
}
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION