JavaRush /وبلاگ جاوا /Random-FA /کافه استراحت شماره 123. Java Constructor - پرسش و پاسخ مص...

کافه استراحت شماره 123. Java Constructor - پرسش و پاسخ مصاحبه فنی

در گروه منتشر شد
منبع: Hackenoon

سازنده چیست؟

سازنده متد خاصی است که در کلاسی با نام کلاس تعریف شده است. سازنده جاوا مانند متدی است که نوع بازگشتی ندارد. کافه استراحت شماره 123.  Java Constructor - پرسش و پاسخ مصاحبه فنی - 1سازنده ها مهمترین نقش را در مقداردهی اولیه آبجکت ها دارند و در این مقاله نمونه سوالات مصاحبه که سازنده ها در جاوا را پوشش می دهند را لیست می کنیم. همچنین با اهمیت سازنده ها در جاوا آشنا خواهید شد، نمونه های کد و سایر جزئیات مهم را مشاهده خواهید کرد که به شما در پاسخ به سوالات مربوط به سازندگان جاوا در مصاحبه کمک می کند.

چرا سازندگان مورد نیاز هستند؟ به تفصیل توضیح دهید

فرض کنید کلاسی به نام دانشجو داریم . و نام متغیر نمونه و roll_number را داریم .
class Student{
String name;
int rollNo;
}
حال، اگر 1000 شی ایجاد کنیم، JVM این مقادیر را با نوع پیش‌فرض Name = null و rollNo = 0 مقداردهی اولیه می‌کند . شناسایی این اشیاء منفرد امکان پذیر نیست و تخصیص مقادیر به هر یک از آبجکت ها باعث افزایش مقدار کد می شود که عمل برنامه نویسی بدی محسوب می شود. بنابراین برای جلوگیری از این امر از سازنده ها استفاده می شود. یعنی هدف سازنده در جاوا مقداردهی متغیرهای نمونه کلاس است.

چه نوع سازنده ای در جاوا وجود دارد؟

سه نوع سازنده مختلف در جاوا وجود دارد:
  • سازنده پیش فرض
  • سازنده بدون آرگومان
  • سازنده پارامتری شده

Default Constructor در جاوا چیست؟

یک سازنده پیش فرض سازنده ای است که توسط JVM در زمان اجرا ایجاد می شود اگر سازنده ای در کلاس تعریف نشده باشد. وظیفه اصلی سازنده پیش‌فرض این است که مقادیر نمونه‌ها را بر اساس نوع پیش‌فرض آنها مقداردهی کند. به عنوان مثال سازنده پیش فرض در جاوا:
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;
}
}

قوانین برای تعریف سازنده چیست؟

برای تعریف سازنده، باید چندین قانون را دنبال کنید:
  • نام سازنده باید با نام کلاس مطابقت داشته باشد.

  • در جاوا نباید نوع بازگشت سازنده وجود داشته باشد.

  • تنها اصلاح کننده های قابل اجرا برای سازنده ها عبارتند از:

    • عمومی
    • پیش فرض
    • حفاظت شده
    • خصوصی
  • سازنده ها می توانند هر تعداد پارامتر را بگیرند.

  • اصلاح کننده های نهایی، همگام، ایستا و انتزاعی در یک سازنده مجاز نیستند.

  • سازنده دستور بازگشت را در بدنه خود پشتیبانی نمی کند.

  • ممکن است استثنائاتی با دستور throw در سازنده وجود داشته باشد .

  • استفاده از بند پرتاب با سازنده قابل قبول است .

  • سازنده نباید بازگشتی ایجاد کند.

چه زمانی می توانیم از سازنده خصوصی استفاده کنیم؟

اگر بخواهیم اشیایی از یک کلاس خاص را از بیرون ایجاد نکنیم، می توانیم از سازنده های بسته یا خصوصی استفاده کنیم. با اعلام خصوصی سازنده ها، می توانیم اشیاء را فقط در داخل کلاس ایجاد کنیم. کلاس های Singleton مثال خوبی برای استفاده از سازنده های خصوصی هستند.

اگر به صراحت آن را تعریف نکنیم، اصلاح کننده دسترسی سازنده پیش فرض چه خواهد بود؟

اصلاح کننده دسترسی سازنده پیش فرض همیشه با اصلاح کننده کلاس یکسان خواهد بود. اگر کلاس عمومی باشد، سازنده نیز عمومی خواهد بود. اگر کلاس خصوصی باشد، سازنده نیز خصوصی خواهد بود. همین امر در مورد سایر اصلاح کننده های دسترسی نیز اتفاق خواهد افتاد.

خروجی قطعه کد زیر را بنویسید و توضیح دهید

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 خوش آمدید. به آکادمی اسکالر توسط 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.");
}
این کد معتبر نیست زیرا یک بازگشت ایجاد می کند. سازنده بدون آرگومان سازنده ای را با پارامتر فراخوانی می کند و سازنده با پارامتر سازنده ای را بدون آرگومان فراخوانی می کند.

آیا می توانیم یک سازنده را در جاوا لغو کنیم؟

خیر، مفهوم اضافه بار سازنده در جاوا قابل اجرا نیست.

آیا سازنده در جاوا می تواند نهایی باشد؟

هیچ سازنده ای نمی تواند نهایی باشد. این به این دلیل است که از کلمات کلیدی نهایی برای جلوگیری از نادیده گرفتن یک متد در یک کلاس مشتق شده استفاده می شود. اما در یک سازنده، مفهوم overriding کاربرد ندارد، بنابراین نیازی به نوشتن کلمه کلیدی نهایی نیست . اگر کلمه کلیدی نهایی را در سازنده بنویسیم، یک خطای زمان کامپایل به نام نوع برگشتی الزامی دریافت می کنیم زیرا کامپایلر آن را به عنوان یک متد در نظر می گیرد.

آیا سازنده در جاوا می تواند ثابت باشد؟

خیر، سازنده جاوا نمی تواند ثابت باشد. این به این دلیل است که از کلمات کلیدی ثابت زمانی استفاده می شود که بخواهیم عضوی به جای یک شیء به یک کلاس تعلق داشته باشد. اما سازنده ها برای مقداردهی اولیه اشیا هستند، بنابراین کامپایلر آن را به عنوان یک متد در نظر می گیرد. یک خطای نوع بازگشت الزامی دریافت خواهیم کرد .

تفاوت بین super()، super و this()، this را توضیح دهید

super() و this() فراخوانی سازنده هستند. فقط برای فراخوانی سازنده کلاس والد یا کلاس فعلی استفاده می شود. توجه داشته باشید که "super" و "this" کلمات کلیدی هستند که برای تعیین اعضای یک نمونه از کلاس خود یا یک کلاس پایه استفاده می شوند. کد زیر را در نظر بگیرید:
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 خوش آمدید " را چاپ می کند. به این صورت است که از این دو کلمه کلیدی برای اشاره به نمونه های عضو کلاس های پایه و مشتق شده استفاده می شود.

ویرانگرها چیست؟ آیا یک تخریبگر در جاوا وجود دارد؟

از تخریب کننده ها برای آزادسازی حافظه به دست آمده توسط یک برنامه استفاده می شود. به عنوان مثال، اگر برنامه ای در حین اجرای آن به حافظه نیاز داشته باشد، تخریب کننده آن حافظه را آزاد می کند تا سایر برنامه ها بتوانند از آن استفاده کنند. در جاوا مفهومی از تخریب کننده وجود ندارد زیرا کار آزادسازی حافظه در جاوا توسط زباله جمع کن انجام می شود.

زنجیره سازی سازنده در جاوا چیست؟

هنگامی که یک سازنده از سازنده دیگری فراخوانی می شود، می توان آن را زنجیره سازی سازنده نامید. فراخوانی سازنده لازم نیست در همان کلاس انجام شود. این را می توان برای کلاس والد نیز انجام داد. برای مثال، تصویر زیر را در نظر بگیرید. کافه استراحت شماره 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 با مشخصات کارمند و آدرس او ایجاد می کنیم . کلاس آدرس Employee توسط کلاس Employee به ارث می رسد . اکنون، برای نمونه‌سازی یک مقدار شی برای یک آدرس، یک مقدار صریح به آدرس کارمند اختصاص نمی‌دهیم. در عوض، از سازنده کلاس Employee Address برای انجام این کار استفاده می کنیم . و با کمک سوپر(آگومان ها) زنجیره ای از سازنده ها را برای مقداردهی اولیه تشکیل می دهیم. زنجیره سازنده یعنی همین.

خروجی برنامه را از روی کد مشخص کنید و پاسخ خود را توضیح دهید.

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