JavaRush /Блоги Java /Random-TG /Кофе-брейк №123. Java Constructor - Саволҳо ва ҷавобҳои м...

Кофе-брейк №123. Java Constructor - Саволҳо ва ҷавобҳои мусоҳибаи техникӣ

Дар гурӯҳ нашр шудааст
Манбаъ: Hackenoon

Конструктор чист?

Конструктор усули махсусест, ки дар синф бо ҳамон ном бо номи синф муайян карда шудааст. Созандаи Java ба усуле монанд аст, ки намуди бозгашт надорад. Кофе-брейк №123.  Java Constructor - Саволҳо ва ҷавобҳои мусоҳибаи техникӣ - 1Конструкторҳо дар оғоз кардани an objectҳо нақши муҳимтаринро мебозанд ва дар ин мақола мо саволҳои мусоҳибаро номбар мекунем, ки конструкторҳоро дар Java фаро мегиранд. Шумо инчунин дар бораи аҳамияти конструкторҳо дар Java меомӯзед, мисолҳои codeҳо ва дигар тафсилоти муҳимро бубинед, ки ба шумо дар посух ба саволҳо дар бораи созандагони Java дар мусоҳиба кӯмак мекунанд.

Чаро конструкторҳо лозиманд? Ба таври муфассал шарҳ диҳед

Фарз мекунем, ки мо як синф дорем бо номи Student . Ва мо номи тағирёбандаи мисол ва 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 эҷод кунем, пас дар дохor 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 намуди бозгашти созанда набояд бошад.

  • Ягона тағирдиҳандаҳои татбиқшаванда барои конструкторҳо инҳоянд:

    • оммавй
    • пешфарз
    • ҳифз шудааст
    • хусусӣ
  • Конструкторҳо метавонанд ҳар як миқдори параметрҳоро гиранд.

  • Тағирдиҳандаҳои ниҳоӣ, ҳамоҳангшуда, статикӣ ва абстрактӣ дар конструктор иҷозат дода намешаванд.

  • Конструктор изҳороти бозгаштро дар дохor баданаш дастгирӣ намекунад .

  • Дар созанда метавонад истисноҳо бо изҳороти throw вуҷуд дошта бошанд .

  • Бо созанда истифода бурдани ибораи партофтан қобor қабул аст .

  • Конструктор набояд рекурсия эҷод кунад.

Кай мо метавонем конструктори хусусиро истифода барем?

Агар мо нахоҳем, ки an objectҳои синфи муайянро аз берун эҷод кунем, мо метавонем конструкторҳои пӯшида ё хусусиро истифода барем. Бо эълон кардани конструкторҳо, мо метавонем an objectҳоро танҳо дар дохor синф эҷод кунем. Синфҳои синглтон намунаи хуби истифодаи конструкторҳои хусусӣ мебошанд.

Агар мо онро ба таври возеҳ муайян накунем, тағирдиҳандаи дастрасии конструктор чӣ хоҳад буд?

Тағирдиҳандаи дастрасии пешфарз ҳамеша бо тағирдиҳандаи синф якхела хоҳад буд. Агар синф оммавӣ бошад, конструктор низ оммавӣ хоҳад буд. Агар синф хусусӣ бошад, пас созанда низ хусусӣ хоҳад буд. Ҳамин чиз бо дигар тағирдиҳандаҳои дастрасӣ рӯй медиҳад.

Натиҷаи пораи 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();
}
}
Рамзи боло чоп хоҳад кард:
Хуш омадед ба InterviewBit. Хуш омадед ба Академияи Scaler аз ҷониби 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();
}
}
Рамзи дар боло зикршуда беэътибор аст, зеро он як конструктор дар дохor созандаи Academy Scaler аст . Ин дар конструктор рекурсияро ба вуҷуд меорад, ки иҷозат дода намешавад. Мутаносибан, мо хатои вақти компилятсионӣ мегирем, ки бо занг ба созандаи рекурсивӣ алоқаманд аст.

Оё мо метавонем ду конструкторро дар як синф дар Java истифода барем?

Бале, мо метавонем дар як синф ҳар як миқдори конструкторҳоро бо назардошти ду шарт истифода барем:
  • Параметрҳои созанда бояд гуногун бошанд.
  • Дар конструктор рекурсия набояд бошад.
Мисол. Ду конструктори як синфи 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 татбиқ намешавад.

Оё конструктор дар Java ниҳоӣ шуда метавонад?

Ҳеҷ як созанда наметавонад ниҳоӣ бошад. Сабаб дар он аст, ки калимаҳои калидӣ барои қатъ кардани барҳам додани усул дар синфи ҳосилшуда истифода мешаванд. Аммо дар конструктор мафҳуми барҳамдиҳӣ татбиқ намегардад, аз ин рӯ зарурати навиштани калимаи ниҳоӣ нест . Агар мо калимаи калидии ниҳоиро дар созанда нависем, мо хатои вақти компилятсионӣ мегирем, ки навъи бозгашти зарурӣ номида мешавад , зеро компилятор ба он ҳамчун усул муносибат мекунад.

Оё конструктор дар Java статикӣ буда метавонад?

Не, созандаи Java наметавонад статикӣ бошад. Сабаб дар он аст, ки калимаҳои калидии статикӣ вақте истифода мешаванд, ки мо мехоҳем, ки аъзо на ба an object, балки ба синф тааллуқ дошта бошад. Аммо конструкторҳо барои оғоз кардани an objectҳо пешбинӣ шудаанд, бинобар ин, компилятор онро ҳамчун усул баррасӣ мекунад. Мо хатои навъи бозгашти лозимиро мегирем .

Фарқи байни super(), super ва this(), 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();
	}
}
Дар ин порчаи code, this.message паёми " Хуш омадед ба Академияи Scaler " -ро чоп мекунад ва super.message " Хуш омадед ба InterviewBit " -ро чоп мекунад . Ҳамин тавр ин ду калимаи калидӣ барои истинод ба мисолҳои аъзои синфҳои асосӣ ва ҳосилшуда истифода мешаванд.

Деструкторҳо чист? Оё дар Java вайронкунанда вуҷуд дорад?

Деструкторҳо барои озод кардани хотираи аз ҷониби барнома гирифташуда истифода мешаванд. Масалан, агар хотира ҳангоми иҷроиш ба ягон барнома лозим бошад, вайронкунанда он хотираро озод мекунад, то дигар барномаҳо аз он истифода баранд. Дар Java мафҳуми харобкунанда вуҷуд надорад, зеро кори озод кардани хотира дар Java аз ҷониби коллектори партовҳо анҷом дода мешавад.

Занҷири конструктор дар Java чист?

Вақте ки як конструктор аз конструктори дигар даъват карда мешавад, инро метавон занҷири конструктор номид. Даъвати созанда набояд дар ҳамон синф анҷом дода шавад. Ин метавонад барои синфи волидайн низ анҷом дода шавад. Барои мисол, тасвири дар поён овардашударо дида бароед. Кофе-брейк №123.  Java Constructor - Саволҳо ва ҷавобҳои мусоҳибаи техникӣ - 2Минбаъд, мо метавонем ба code нигаред, то an objectро бо арзишҳои арзиши ин тағирёбандаҳои мисол оғоз кунем:
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 барои суроға, мо ба суроғаи корманд арзиши возеҳ таъин намекунем. Ба ҷои ин, мо барои ин кор конструктори синфи Суроғаи кормандро истифода мебарем . Ва бо ёрии супер(далелҳо) мо як силсилаи конструкторҳоро барои оғоз кардани арзишҳо ташкил мекунем. Занҷири созанда маҳз ҳамин аст.

Натиҷаи барномаро аз code муайян кунед ва ҷавоби худро шарҳ диҳед.

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 истифода мешаванд , он ба усул табдил меёбад. Аз ин рӯ, мо усулро даъват намекунем. Мо ягон натиҷа ба даст намеорем, зеро барои иҷро кардани усул мо бояд онро ба таври возеҳ дар 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