JavaRush /Java blogi /Random-UZ /Kofe tanaffusi №123. Java konstruktori - texnik intervyu ...

Kofe tanaffusi №123. Java konstruktori - texnik intervyu savollari va javoblari

Guruhda nashr etilgan
Manba: Hackenoon

Konstruktor nima?

Konstruktor - bu sinf nomi bilan bir xil nomga ega bo'lgan sinfda aniqlangan maxsus usul. Java konstruktori qaytish turiga ega bo'lmagan usulga o'xshaydi. Kofe tanaffusi №123.  Java konstruktori - texnik intervyu savollari va javoblari - 1Ob'ektlarni ishga tushirishda konstruktorlar eng muhim rol o'ynaydi va ushbu maqolada biz Java-dagi konstruktorlarni qamrab oluvchi intervyu savollarining namunalarini sanab o'tamiz. Shuningdek, siz Java-da konstruktorlarning ahamiyati haqida bilib olasiz, intervyuda Java konstruktorlari haqidagi savollarga javob berishga yordam beradigan kod misollari va boshqa muhim tafsilotlarni ko'rasiz.

Konstruktorlar nima uchun kerak? Batafsil tushuntiring

Aytaylik, bizda Talaba nomli sinf bor . Va bizda misol o'zgaruvchisi nomi va roll_number mavjud .
class Student{
String name;
int rollNo;
}
Endi, agar biz 1000 ta ob'ekt yaratsak, JVM bu qiymatlarni o'zining standart turi Name = null va rollNo = 0 bilan ishga tushiradi . Ushbu individual ob'ektlarni aniqlash mumkin emas va ob'ektlarning har biriga qiymatlarni belgilash noto'g'ri dasturlash amaliyoti deb hisoblangan kod miqdorini oshiradi. Shuning uchun, buning oldini olish uchun konstruktorlardan foydalaniladi. Ya'ni, Java'dagi konstruktorning maqsadi sinf namunasi o'zgaruvchilari qiymatini ishga tushirishdir.

Java-da qanday turdagi konstruktorlar mavjud?

Java-da konstruktorlarning uch xil turi mavjud:
  • Standart konstruktor
  • Argumentsiz konstruktor
  • Parametrlangan konstruktor

Java'da standart konstruktor nima?

Standart konstruktor, agar sinfda konstruktor aniqlanmagan bo'lsa, JVM tomonidan ish vaqtida yaratilgan konstruktor. Standart konstruktorning asosiy vazifasi namunalar qiymatlarini standart turiga qarab ishga tushirishdir. Java'dagi standart konstruktorga misol:
class DefaultConstructor{
int id;
String name;
}
Endi bu sinf uchun, agar ob'ekt yaratadigan bo'lsak, JVM ichida standart qiymat berilgan standart konstruktor bo'ladi.
DefaultConstructor df= new DefaultConstructor();
Endi qiymatni chop etsak, biz quyidagilarni olamiz:
Chop etish = df.id = 0.df.name = null.

Argumentsiz konstruktor nima?

Argumentsiz konstruktor misollar qiymatini ishga tushirish uchun aniq belgilanishi mumkin bo'lgan konstruktordir. Masalan:
class NoArgConstuctor{ int a; int b;

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

}

Parametrlashtirilgan konstruktor nima?

Parametrlangan konstruktor misollarni ishga tushirish uchun parametrni qabul qiluvchi konstruktordir. Masalan:
class ParameterizedConstuctor{
String name;
int age;
//Parameterized Constructor
ParameterizedConstuctor(String name, int age){
this.name = name;
this.age = age;
}
}

Konstruktorni belgilash qoidalari qanday?

Konstruktorlarni aniqlash uchun siz bir nechta qoidalarga amal qilishingiz kerak:
  • Konstruktor nomi sinf nomiga mos kelishi kerak.

  • Java-da konstruktorni qaytarish turi bo'lmasligi kerak.

  • Konstruktorlar uchun yagona qo'llaniladigan modifikatorlar:

    • ommaviy
    • standart
    • himoyalangan
    • xususiy
  • Konstruktorlar istalgan miqdordagi parametrlarni qabul qilishlari mumkin.

  • Konstruktorda yakuniy, sinxronlashtirilgan, statik va mavhum modifikatorlarga ruxsat berilmaydi.

  • Konstruktor o'z tanasida qaytarish bayonotini qo'llab-quvvatlamaydi.

  • Konstruktorda throw iborasi bilan istisnolar bo'lishi mumkin .

  • Konstruktor bilan throws gapidan foydalanish maqbuldir .

  • Konstruktor rekursiya yaratmasligi kerak.

Shaxsiy konstruktordan qachon foydalanishimiz mumkin?

Agar biz tashqaridan ma'lum bir sinf ob'ektlarini yaratmoqchi bo'lmasak, biz yopiq yoki xususiy konstruktorlardan foydalanishimiz mumkin. Konstruktorlarni shaxsiy deb e'lon qilish orqali biz ob'ektlarni faqat sinf ichida yaratishimiz mumkin. Singleton sinflari xususiy konstruktorlardan foydalanishning yaxshi namunasidir.

Agar biz uni aniq belgilamasak, standart konstruktorga kirish modifikatori nima bo'ladi?

Standart konstruktorga kirish modifikatori har doim sinf modifikatori bilan bir xil bo'ladi. Agar sinf ommaviy bo'lsa, konstruktor ham ommaviy bo'ladi. Agar sinf xususiy bo'lsa, konstruktor ham shaxsiy bo'ladi. Boshqa kirish modifikatorlari bilan ham xuddi shunday bo'ladi.

Quyidagi kod parchasining natijasini yozing va tushuntiring

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();
}
}
Yuqoridagi kod chop etiladi:
InterviewBit-ga xush kelibsiz. InterviewBit tomonidan Scaler Akademiyasiga xush kelibsiz.
Biz ushbu natijani olamiz, chunki agar birinchi qatordagi konstruktorga super() yoki this() kalit so'zini kiritmasak , JVM uni avtomatik ravishda ish vaqtiga qo'yadi. JVM buni boshqa sinfdan meros bo'lgani uchun qiladi va uning funksionalligi olingan sinfda ham amalga oshiriladi. Shunday qilib, asosiy sinf misollariga standart qiymatlarni belgilashda JVM sukut bo'yicha super() kalit so'zini qo'shadi .

Kodni ko'rib chiqing va uning haqiqiy yoki noto'g'ri ekanligini ko'rsating. Sababini tushuntiring

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();
}
}
Yuqoridagi kod yaroqsiz, chunki u Scaler Academy konstruktori ichidagi bir xil konstruktordir . Bu konstruktorda rekursiya hosil qiladi, bunga ruxsat berilmaydi. Shunga ko'ra, biz rekursiv konstruktorga qo'ng'iroq qilish bilan bog'liq kompilyatsiya vaqtida xatolikni olamiz.

Java-da bitta sinfda ikkita konstruktordan foydalana olamizmi?

Ha, ikkita shartga rioya qilgan holda bitta sinfda istalgan sonli konstruktorlardan foydalanishimiz mumkin:
  • Konstruktor parametrlari boshqacha bo'lishi kerak.
  • Konstruktorda rekursiya bo'lmasligi kerak.
Misol. Xuddi shu InterviewBit sinfining ikkita konstruktorini ko'rib chiqing :
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.");
}
Bu kod yaroqsiz, chunki u rekursiya yaratadi. Argumentlari bo'lmagan konstruktor parametrlari bo'lgan konstruktorni, parametrlari bo'lgan konstruktor esa argumentsiz konstruktorni chaqiradi.

Java-da konstruktorni bekor qila olamizmi?

Yo'q, konstruktorni ortiqcha yuklash tushunchasi Java-da qo'llanilmaydi.

Java-da konstruktor yakuniy bo'lishi mumkinmi?

Hech bir konstruktor yakuniy bo'lishi mumkin emas. Buning sababi, yakuniy kalit so'zlar hosila sinfdagi usulni bekor qilishni to'xtatish uchun ishlatiladi. Ammo konstruktorda bekor qilish tushunchasi qo'llanilmaydi, shuning uchun yakuniy kalit so'zni yozishning hojati yo'q . Yakuniy kalit so'zni konstruktorga yozadigan bo'lsak, kompilyator uni usul sifatida ko'rgani uchun talab qilinadigan qaytarish turi deb nomlangan kompilyatsiya vaqtida xatolikka ega bo'lamiz.

Java'da konstruktor statik bo'lishi mumkinmi?

Yo'q, Java konstruktori statik bo'lishi mumkin emas. Buning sababi shundaki, statik kalit so'zlar a'zoni ob'ektga emas, balki sinfga tegishli bo'lishini xohlaganimizda ishlatiladi. Ammo konstruktorlar ob'ektlarni ishga tushirish uchun mo'ljallangan, shuning uchun kompilyator uni usul sifatida ko'rib chiqadi. Biz talab qilinadigan qaytarish turi xatosini olamiz .

Super(), super va this(), this o'rtasidagi farqni tasvirlab bering

super() va this() konstruktor chaqiruvlaridir. U faqat asosiy sinfning konstruktorini yoki joriy sinfni chaqirish uchun ishlatiladi. E'tibor bering, "super" va "bu" o'z sinfiga yoki asosiy sinfga tegishli a'zolarni belgilash uchun ishlatiladigan kalit so'zlardir. Quyidagi kodni ko'rib chiqing:
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();
	}
}
Ushbu kod parchasida this.message “ Scaler Academy ga xush kelibsiz ” va super.message “ InterviewBit ga xush kelibsiz ” xabarini chop etadi . Ushbu ikkita kalit so'z asosiy va hosila sinflarning a'zo misollariga murojaat qilish uchun shunday ishlatiladi.

Destruktorlar nima? Java'da destruktor bormi?

Destruktorlar dastur tomonidan olingan xotirani bo'shatish uchun ishlatiladi. Masalan, agar dastur bajarilayotganda xotira kerak bo'lsa, destruktor boshqa dasturlar foydalanishi uchun bu xotirani bo'shatadi. Java-da destruktor tushunchasi mavjud emas, chunki Java-da xotirani bo'shatish ishi axlat yig'uvchi tomonidan amalga oshiriladi.

Java-da konstruktor zanjiri nima?

Agar bitta konstruktor boshqa konstruktordan chaqirilsa, buni konstruktor zanjiri deb atash mumkin. Konstruktor chaqiruvi bir xil sinfda amalga oshirilishi shart emas. Buni ota-onalar sinfi uchun ham qilish mumkin. Misol uchun, quyidagi rasmni ko'rib chiqing. Kofe tanaffusi №123.  Java Konstruktor - Texnik intervyu savollari va javoblari - 2Keyinchalik, biz ushbu misol o'zgaruvchilarning qiymat qiymatlari bilan ob'ektni ishga tushirish uchun kodni ko'rib chiqishimiz mumkin:
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");
}
Yuqoridagi kodda biz xodim tafsilotlari va uning manzili bilan Xodimlar sinfi ob'ektini yaratmoqdamiz. Xodimlar manzili sinfi Xodimlar sinfi tomonidan meros qilib olinadi . Endi manzil uchun ob'ekt qiymatini yaratish uchun biz xodimning manziliga aniq qiymat belgilamaymiz. Buning o'rniga, biz buni amalga oshirish uchun Xodimlar manzili sinfining konstruktoridan foydalanamiz . Va super(argumentlar) yordamida qiymatlarni ishga tushirish uchun konstruktorlar zanjirini hosil qilamiz. Bu konstruktor zanjiri degani.

Koddan dastur chiqishini aniqlang va javobingizni tushuntiring.

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();
}
Yuqoridagi kod hech narsani chop etmaydi, chunki InterviewBit() bu yerda konstruktor emas. Void va int kalit so'zlari ishlatilganligi sababli u usulga aylanadi. Shuning uchun biz usulni chaqirmaymiz. Biz hech qanday natijani olmaymiz, chunki usulni bajarish uchun uni ob'ektda aniq chaqirishimiz kerak.

Konstruktor yordamida ob'ektning qiymatlarini yangi ob'ektga nusxalash dasturini yozing

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);
}
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION