JavaRush /Java блогу /Random-KY /Кофе-брейк №123. Java Constructor - Техникалык интервью с...

Кофе-брейк №123. Java Constructor - Техникалык интервью суроолору жана жооптору

Группада жарыяланган
Булак: Hackenoon

Конструктор деген эмне?

Конструктор класстын аталышы менен бирдей аталыштагы класста аныкталган атайын ыкма. Java конструктору кайтаруу түрү жок ыкмага окшош. Кофе-брейк №123.  Java Constructor - Техникалык интервью суроолору жана жооптору - 1Объекттерди инициализациялоодо конструкторлор эң маанилүү ролду ойнойт жана бул макалада биз Java конструкторлорун камтыган интервью суроолорунун үлгүсүн тизмектейбиз. Сиз ошондой эле Java конструкторлорунун маанилүүлүгү жөнүндө биле аласыз, интервьюда Java конструкторлору жөнүндө суроолорго жооп берүүгө жардам бере турган code мисалдарын жана башка маанилүү деталдарды көрөсүз.

Эмне үчүн конструкторлор керек? майда-чүйдөсүнө чейин түшүндүрүп

Бизде Студент деген класс бар дейли . Жана бизде инстанция өзгөрмө аты жана roll_number бар .
class Student{
String name;
int rollNo;
}
Эми, эгерде биз 1000 an object түзсөк, анда JVM бул маанилерди өзүнүн демейки түрү Name = null жана rollNo = 0 менен инициализациялайт . Бул жеке an objectилерди аныктоо мүмкүн эмес жана an objectтердин ар бирине маанилерди ыйгаруу codeдун көлөмүн көбөйтөт, бул жаман программалоо практикасы деп эсептелет. Ошондуктан, муну болтурбоо үчүн конструкторлор колдонулат. Башкача айтканда, Javaдагы конструктордун максаты класс инстанциясынын өзгөрмөлөрүнүн маанисин инициализациялоо болуп саналат.

Javaда конструкторлордун кандай түрлөрү бар?

Javaда конструкторлордун үч түрдүү түрү бар:
  • Демейки конструктор
  • Аргументсиз конструктор
  • Параметрленген конструктор

Javaдагы демейки конструктор деген эмне?

Демейки конструктор класста эч кандай конструктор аныкталбаса, JVM тарабынан иштөө убагында түзүлгөн конструктор. Демейки конструктордун негизги милдети - демейки түрүнө ылайык инстанциялардын маанилерин инициализациялоо. Javaдагы демейки конструктордун мисалы:
class DefaultConstructor{
int id;
String name;
}
Эми бул класс үчүн, эгерде биз an object түзсөк, анда JVM ичинде демейки маани берилген демейки конструктор болот.
DefaultConstructor df= new DefaultConstructor();
Эми биз маанини басып чыгарсак, биз алабыз:
Басып чыгаруу = 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да конструктор кайтаруу түрү болбошу керек.

  • Конструкторлор үчүн гана колдонулуучу модификаторлор:

    • коомдук
    • демейки
    • корголгон
    • жеке
  • Конструкторлор каалаган сандагы параметрлерди ала алышат.

  • Конструктордо акыркы, синхрондоштурулган, статикалык жана абстракттуу модификаторлорго жол берилбейт.

  • Конструктор өз денесинде кайтаруу билдирүүсүн колдобойт .

  • Конструктордо таштоо билдирүүсү менен өзгөчө учурлар болушу мүмкүн .

  • Конструктор менен ыргытуу сүйлөмүн колдонуу алгылыктуу .

  • Конструктор рекурсияны жаратпашы керек.

Жеке конструкторду качан колдоно алабыз?

Сырттан белгилүү бир класстын an objectтерин түзүүнү каалабасак, жабык же жеке конструкторлорду колдонсок болот. Конструкторлорду купуя деп жарыялоо менен биз an objectтерди класстын ичинде гана түзө алабыз. Singleton класстары жеке конструкторлорду колдонуунун жакшы мисалы болуп саналат.

Эгерде биз аны так аныктабасак, демейки конструкторго кирүү модификатору кандай болот?

Демейки конструктор кирүү модификатору ар дайым класс өзгөрткүчү менен бирдей болот. Эгерде класс жалпыга ачык болсо, конструктор дагы ачык болот. Эгерде класс жеке болсо, анда конструктор да жеке болот. Башка кирүү өзгөрткүчтөрү менен да ушундай болот.

Төмөндөгү code үзүндүнүн жыйынтыгын жазыңыз жана түшүндүрүңүз

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();
}
}
Жогорудагы code басып чыгарат:
InterviewBit'ке кош келиңиз. InterviewBit аркылуу Scaler академиясына кош келиңиз.
Биз бул чыгарылышты алабыз, анткени биз биринчи саптагы конструкторго 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();
}
}
Жогорудагы code жараксыз, анткени ал Scaler Academy конструкторунун ичиндеги бир эле конструктор . Бул конструктордо рекурсияны жаратат, ага уруксат берилбейт. Демек, биз рекурсивдүү конструкторго чакыруу менен байланышкан компиляция убактысынын катасын алабыз.

Java тorнде бир класста эки конструкторду колдоно алабызбы?

Ооба, биз эки шарт менен бир класста каалаган сандагы конструкторлорду колдоно алабыз:
  • Конструктордун параметрлери башка болушу керек.
  • Конструктордо рекурсия болбошу керек.
Мисал. Ошол эле 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.");
}
Бул code жараксыз, анткени ал рекурсияны жаратат. Аргументтери жок конструктор параметрлери бар конструкторду, ал эми параметрлери бар конструктор аргументтери жок конструкторду чакырат.

Javaдагы конструкторду жокко чыгара алабызбы?

Жок, конструкторду ашыкча жүктөө түшүнүгү Javaда колдонулbyte.

Javaда конструктор акыркы боло алабы?

Эч бир конструктор акыркы боло алbyte. Себеби, акыркы ачкыч сөздөр туунду класстагы методду жокко чыгарууну токтотуу үчүн колдонулат. Бирок конструктордо жокко чыгаруу түшүнүгү колдонулbyte, ошондуктан акыркы ачкыч сөздү жазуунун кереги жок . Эгерде биз конструктордо акыркы ачкыч сөздү жазсак, анда биз компилятор аны метод катары карагандыктан, талап кылынган кайтаруу түрү деп аталган компиляция убактысынын катасын алабыз.

Javaда конструктор статикалык боло алабы?

Жок, Java конструктору статикалык болушу мүмкүн эмес. Себеби, статикалык ачкыч сөздөр биз мүчө an objectке эмес, класска таандык болушун каалаганда колдонулат. Бирок конструкторлор an objectтерди инициализациялоо үчүн арналган, ошондуктан компилятор аны метод катары карайт. Биз талап кылынган кайтаруу түрүндөгү катаны алабыз .

super(), super жана this(), this ортосундагы айырманы сүрөттөп бергиле

super() жана this() конструктор чалуулары. Ал ата-эне класстын конструкторун же учурдагы классты чакыруу үчүн гана колдонулат. "супер" жана "бул" өз классынын же базалык класстын мүчөлөрүн белгилөө үчүн колдонулган ачкыч сөздөр экенин эске алыңыз. Төмөндөгү codeду карап көрүңүз:
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();
	}
}
Бул code үзүндүсүндө this.message “ Скалер академиясына кош келиңиз ” билдирүүсүн жана super.messageInterviewBitке кош келиңиз ” деп басып чыгарат. Бул эки ачкыч сөз базалык жана туунду класстардын мүчө инстанцияларына карата колдонулат.

Деструкторлор деген эмне? Javaда деструктор барбы?

Деструкторлор программа тарабынан алынган эстутумду бошотуу үчүн колдонулат. Мисалы, эстутум программанын аткарылышы учурунда керек болсо, деструктор ошол эстутумду башка программалар колдоно алышы үчүн бошотот. Java-да деструктор деген түшүнүк жок, анткени Java-да эстутумду бошотуу иши таштанды жыйноочу тарабынан аткарылат.

Javaда конструктор чынжыр деген эмне?

Бир конструктор башка конструктордон чакырылганда, муну конструктордук чынжыр деп атоого болот. Конструктор чакырыгы бир класста жасалбашы керек. Муну ата-энелер классы үчүн да жасоого болот. Мисалы, төмөнкү сүрөттү карап көрөлү. Кофе-брейк №123.  Java Constructor - Техникалык интервью суроолору жана жооптору - 2Андан кийин, биз бул инстанция өзгөрмөлөрүнүн баалуулуктары менен an objectти инициализациялоо үчүн codeду карай алабыз:
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");
}
Жогорудагы codeдо биз кызматкердин маалыматы жана анын дареги менен Кызматкер классынын an objectисин түзүп жатабыз. Кызматкердин дареги классы Кызматкер классы тарабынан мурасталат . Эми, дарек үчүн an objectтин маанисин түзүү үчүн, биз кызматкердин дарегине ачык маани бербейбиз. Анын ордуна, биз бул үчүн Кызматкерлердин дареги классынын конструкторун колдонобуз . Жана super(аргументтердин) жардамы менен биз маанилерди инициализациялоо үчүн конструкторлордун чынжырын түзөбүз. Конструктордук чынжыр деген ушул.

Коддон программанын натыйжасын аныктаңыз жана жообуңузду түшүндүрүңүз.

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();
}
Жогорудагы code эч нерсени басып чыгарbyte, анткени InterviewBit() бул жерде конструктор эмес. Void жана int ачкыч сөздөрү колдонулгандыктан , ал методго айланат. Ошон үчүн биз ыкманы атабайбыз. Биз эч кандай жыйынтык албайбыз, анткени методду ишке ашыруу үчүн аны an objectте ачык чакырышыбыз керек.

Конструктордун жардамы менен an objectтин баалуулуктарын жаңы an objectке көчүрүү программасын жазыңыз

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