JavaRush /Java Blogu /Random-AZ /Kofe fasiləsi №123. Java Constructor - Texniki Müsahibə S...

Kofe fasiləsi №123. Java Constructor - Texniki Müsahibə Sualları və Cavabları

Qrupda dərc edilmişdir
Mənbə: Hackenoon

Konstruktor nədir?

Konstruktor sinif adı ilə eyni ada malik sinifdə müəyyən edilmiş xüsusi metoddur. Java konstruktoru qaytarma növü olmayan metod kimidir. Kofe fasiləsi №123.  Java Constructor - Texniki Müsahibə Sualları və Cavabları - 1Konstruktorlar obyektlərin işə salınmasında ən mühüm rol oynayır və bu məqalədə Java-da konstruktorları əhatə edən nümunə müsahibə suallarını sadalayacağıq. Siz həmçinin Java-da konstruktorların əhəmiyyətini öyrənəcək, müsahibə zamanı Java konstruktorları ilə bağlı suallara cavab verməyə kömək edəcək kod nümunələrinə və digər vacib detallara baxacaqsınız.

Konstruktorlar niyə lazımdır? Ətraflı izah edin

Tutaq ki, Tələbə adlı bir sinifimiz var . Və bizdə misal dəyişəninin adı və roll_number var .
class Student{
String name;
int rollNo;
}
İndi 1000 obyekt yaratsaq, JVM bu dəyərləri öz standart növü ilə başlatacaq Name = nullrollNo = 0 . Bu fərdi obyektləri müəyyən etmək mümkün deyil və obyektlərin hər birinə dəyər təyin etmək pis proqramlaşdırma təcrübəsi hesab edilən kodun miqdarını artıracaq. Buna görə də bunun qarşısını almaq üçün konstruktorlardan istifadə olunur. Yəni Java-da konstruktorun məqsədi sinif nümunəsi dəyişənlərinin dəyərini işə salmaqdır.

Java-da hansı tip konstruktorlar var?

Java-da üç fərqli konstruktor növü var:
  • Defolt Konstruktor
  • Arqumentsiz Konstruktor
  • Parametrləşdirilmiş Konstruktor

Java-da Defolt Konstruktor nədir?

Defolt Konstruktor, sinifdə heç bir konstruktor müəyyən edilmədikdə, JVM tərəfindən iş vaxtında yaradılan konstruktordur. Defolt konstruktorun əsas işi nümunələrin dəyərlərini standart tiplərinə uyğun olaraq başlatmaqdır. Java-da standart konstruktor nümunəsi:
class DefaultConstructor{
int id;
String name;
}
İndi bu sinif üçün, əgər biz bir obyekt yaratsaq, JVM daxilində defolt dəyər verilən standart konstruktor olacaq.
DefaultConstructor df= new DefaultConstructor();
İndi dəyəri çap etsək, alacağıq:
Çap = df.id = 0.df.name = null.

Arqumentsiz Konstruktor nədir?

Arqumentsiz konstruktor nümunələrin dəyərini işə salmaq üçün açıq şəkildə müəyyən edilə bilən konstruktordur. Misal üçün:
class NoArgConstuctor{ int a; int b;

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

}

Parametrləşdirilmiş konstruktor nədir?

Parametrləşdirilmiş konstruktor nümunələri işə salmaq üçün parametr qəbul edən konstruktordur. Misal üçün:
class ParameterizedConstuctor{
String name;
int age;
//Parameterized Constructor
ParameterizedConstuctor(String name, int age){
this.name = name;
this.age = age;
}
}

Konstruktoru təyin etmək üçün hansı qaydalar var?

Konstruktorları müəyyən etmək üçün bir neçə qaydaya əməl etməlisiniz:
  • Konstruktor adı sinif adına uyğun olmalıdır.

  • Java-da konstruktor qaytarma növü olmamalıdır.

  • Konstruktorlar üçün yeganə tətbiq olunan dəyişdiricilər bunlardır:

    • ictimai
    • default
    • qorunur
    • özəl
  • Konstruktorlar istənilən sayda parametr qəbul edə bilər.

  • Konstruktorda final, sinxronlaşdırılmış, statik və abstrakt dəyişdiricilərə icazə verilmir.

  • Konstruktor öz bədən daxilində qaytarma ifadəsini dəstəkləmir .

  • Konstruktorda atma ifadəsi ilə istisnalar ola bilər .

  • Konstruktorla atma bəndindən istifadə etmək məqbuldur .

  • Konstruktor rekursiya yaratmamalıdır.

Şəxsi konstruktordan nə vaxt istifadə edə bilərik?

Kənardan müəyyən bir sinif obyektlərini yaratmaq istəmiriksə, qapalı və ya özəl konstruktorlardan istifadə edə bilərik. Konstruktorları özəl elan etməklə biz yalnız sinif daxilində obyektlər yarada bilərik. Singleton sinifləri özəl konstruktorların istifadəsinə yaxşı nümunədir.

Əgər biz onu açıq şəkildə təyin etməsək, standart konstruktora giriş modifikatoru nə olacaq?

Defolt konstruktor giriş dəyişdiricisi həmişə sinif dəyişdiricisi ilə eyni olacaq. Sinif açıqdırsa, konstruktor da ictimai olacaq. Sinif özəldirsə, konstruktor da özəl olacaq. Eyni şey digər giriş modifikatorları ilə də baş verəcəkdir.

Aşağıdakı kod parçasının çıxışını yazın və izah edin

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();
}
}
Yuxarıdakı kod çap olunacaq:
InterviewBit-ə xoş gəlmisiniz. InterviewBit tərəfindən Scaler Akademiyasına xoş gəlmisiniz.
Biz bu çıxışı alacağıq, çünki super() və ya this() açar sözünü birinci sətirdəki konstruktora daxil etməsək , JVM onu avtomatik olaraq icra zamanı daxil edəcək. JVM bunu edir, çünki o, başqa sinifdən miras alır və onun funksionallığı törəmə sinifdə də həyata keçiriləcək. Beləliklə, əsas sinif nümunələrinə standart dəyərlər təyin edərkən, JVM defolt olaraq super() açar sözünü əlavə edir .

Kodu nəzərdən keçirin və onun etibarlı və ya etibarsız olduğunu göstərin. Səbəbini izah edin

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();
}
}
Yuxarıdakı kod etibarsızdır, çünki Scaler Academy konstruktoru daxilində eyni konstruktordur . Bu konstruktorda rekursiya yaradır, buna icazə verilmir. Müvafiq olaraq, biz rekursiv konstruktora çağırışla bağlı kompilyasiya vaxtı xətası alacağıq.

Java-da bir sinifdə iki konstruktordan istifadə edə bilərikmi?

Bəli, biz iki şərtə uyğun olaraq bir sinifdə istənilən sayda konstruktordan istifadə edə bilərik:
  • Konstruktor parametrləri fərqli olmalıdır.
  • Konstruktorda rekursiya olmamalıdır.
Misal. Eyni InterviewBit sinifinin iki konstruktorunu nəzərdən keçirin :
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 etibarlı deyil, çünki rekursiya yaradacaq. Arqumentləri olmayan konstruktor parametrləri olan konstruktoru, parametrləri olan konstruktor isə heç bir arqumenti olmayan konstruktoru çağıracaq.

Java-da konstruktoru ləğv edə bilərikmi?

Xeyr, konstruktorun həddən artıq yüklənməsi konsepsiyası Java-da tətbiq edilmir.

Java-da konstruktor final ola bilərmi?

Heç bir konstruktor son ola bilməz. Bunun səbəbi, son açar sözlərdən törəmə sinifdə metodu ləğv etməyi dayandırmaq üçün istifadə edilməsidir. Lakin konstruktorda üstələmə anlayışı tətbiq edilmir, ona görə də final açar sözünü yazmağa ehtiyac yoxdur . Konstruktorda son açar sözü yazsaq, kompilyator onu metod kimi qəbul etdiyi üçün tələb olunan qaytarma növü adlanan kompilyasiya vaxtı xətası alacağıq .

Java-da konstruktor statik ola bilərmi?

Xeyr, Java konstruktoru statik ola bilməz. Bunun səbəbi, statik açar sözlərdən bir üzvün obyektə deyil, bir sinfə aid olmasını istədikdə istifadə olunur. Lakin konstruktorlar obyektləri işə salmaq üçün nəzərdə tutulub, ona görə də kompilyator onu metod kimi qəbul edəcək. Biz tələb olunan qaytarma növü xətası alacağıq .

Super(), super və this(), this arasındakı fərqi təsvir edin

super()this() konstruktor çağırışlarıdır. Yalnız ana sinifin və ya cari sinfin konstruktorunu çağırmaq üçün istifadə olunur. Nəzərə alın ki, “super” və “bu” öz sinfinin və ya baza sinfinin bir nümunəsinin üzvlərini təyin etmək üçün istifadə olunan açar sözlərdir. Aşağıdakı kodu nəzərdən keçirin:
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();
	}
}
Bu kod parçasında this.message “ Scaler Academy-yə xoş gəlmisiniz ” mesajını , super.message isəInterviewBit-ə xoş gəlmisiniz ” yazısını çap edəcək. Bu iki açar sözdən əsas və törəmə siniflərin üzv nümunələrinə istinad etmək üçün istifadə olunur.

Dağıdıcılar nədir? Java-da dağıdıcı varmı?

Destruktorlar proqram tərəfindən əldə edilmiş yaddaşı boşaltmaq üçün istifadə olunur. Məsələn, proqramın icrası zamanı yaddaşa ehtiyac yaranarsa, destruktor həmin yaddaşı başqa proqramların istifadə edə bilməsi üçün boşaldır. Java-da dağıdıcı anlayışı yoxdur, çünki Java-da yaddaşın boşaldılması işi zibil toplayıcısı tərəfindən idarə olunur.

Java-da konstruktor zənciri nədir?

Bir konstruktor digər konstruktordan çağırıldıqda bunu konstruktor zəncirləməsi adlandırmaq olar. Konstruktor çağırışının eyni sinifdə edilməsi lazım deyil. Bu, valideyn sinfi üçün də edilə bilər. Məsələn, aşağıdakı şəkli nəzərdən keçirin. Kofe fasiləsi №123.  Java Constructor - Texniki Müsahibə Sualları və Cavabları - 2Sonra, obyekti bu nümunə dəyişənlərinin dəyər dəyərləri ilə işə salmaq üçün koda baxa bilərik:
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");
}
Yuxarıdakı kodda biz işçinin təfərrüatları və onun ünvanı ilə İşçi sinfi obyekti yaradırıq. İşçi ünvanı sinfi Employee sinfi tərəfindən miras alınır . İndi ünvan üçün obyekt dəyərini yaratmaq üçün işçinin ünvanına açıq dəyər təyin etmirik. Bunun əvəzinə biz bunu etmək üçün İşçinin Ünvanı sinfinin konstruktorundan istifadə edirik . Və super(arqumentlərin) köməyi ilə dəyərləri işə salmaq üçün konstruktorlar silsiləsi əmələ gətiririk. Konstruktor zənciri budur.

Proqramın çıxışını koddan müəyyən edin və cavabınızı izah edin.

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();
}
Yuxarıdakı kod heç nə çap etməyəcək, çünki InterviewBit() burada konstruktor deyil. Voidint açar sözlərindən istifadə edildiyi üçün metoda çevrilir. Buna görə də biz metodu çağırmırıq. Biz heç bir nəticə əldə etməyəcəyik, çünki metodu yerinə yetirmək üçün onu obyektdə açıq şəkildə çağırmalıyıq.

Konstruktordan istifadə edərək obyektin dəyərlərini yeni obyektə köçürmək üçün proqram yazın

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