JavaRush /Java блог /Random UA /Кава-брейк #123. Java Constructor — питання та відповіді ...

Кава-брейк #123. Java Constructor — питання та відповіді на технічну співбесіду

Стаття з групи Random UA
Джерело: Hackenoon

Що таке Constructor?

Constructor - це спеціальний метод, визначений у класі з ім'ям, що збігається з ім'ям класу. Конструктор Java подібний до методу, що не має типу, що повертається. Кава-брейк #123.  Java Constructor - питання та відповіді на технічному співбесіді - 1Конструктори відіграють найбільш важливу роль при ініціалізації об'єктів, і в цій статті ми перерахуємо приблизні питання на інтерв'ю, які торкаються конструкторів Java. Також ви дізнаєтесь про важливість конструкторів у Java, побачите приклади коду та інші важливі деталі, які допоможуть вам відповісти на питання про Java-конструкторів на співбесіді.

Навіщо потрібні конструктори? Поясніть детально

Припустимо, ми маємо клас з ім'ям Student . І у нас є ім'я змінної екземпляра та roll_number .
class Student{
String name;
int rollNo;
}
Тепер, якщо ми створимо 1000 об'єктів, JVM ініціалізує ці значення своїм типом за промовчанням Name = null і rollNo = 0 . Ідентифікація цих окремих об'єктів неможлива, а надання значень кожному з об'єктів збільшить обсяг коду, що вважається поганою практикою в програмуванні. Тому, щоб цього уникнути, використовують конструктори. Тобто мета конструктора в Java полягає в тому, щоб ініціалізувати значення змінних екземпляра класу.

Які типи конструкторів існують у Java?

У Java є три різних типи конструкторів:
  • Default Constructor (Конструктор за замовчуванням)
  • No-Argument Constructor (Конструктор без аргументів)
  • Parameterized Constructor (Параметризований конструктор)

Що таке Default Constructor у Java?

Конструктор за замовчуванням (Default Constructor) – це конструктор, створений JVM під час виконання, якщо конструктор не визначений у класі. Основне завдання конструктора за замовчуванням - ініціалізувати значення екземплярів відповідно до їх типу за замовчуванням. Приклад конструктора за замовчуванням у Java:
class DefaultConstructor{
int id;
String name;
}
Тепер для цього класу, якщо ми створимо об'єкт, то всередині JVM з'явиться стандартний конструктор, якому присвоєно значення за замовчуванням.
DefaultConstructor df= new DefaultConstructor();
Тепер, якщо ми надрукуємо значення, то отримаємо:
Print = df.id = 0.df.name = null.

Що таке No-Argument Constructor (Конструктор без аргументів)?

Конструктор без аргументів це конструктор, який можна явно визначити для ініціалізації значення екземплярів. Наприклад:
class NoArgConstuctor{ int a; int b;

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

}

Що таке Parameterized Constructor (Параметризований конструктор)?

Параметризований конструктор - це конструктор, який приймає параметр для ініціалізації екземплярів. Наприклад:
class ParameterizedConstuctor{
String name;
int age;
//Parameterized Constructor
ParameterizedConstuctor(String name, int age){
this.name = name;
this.age = age;
}
}

Які правила визначення конструктора?

Для визначення конструкторів необхідно дотримуватися кількох правил:
  • Ім'я конструктора має збігатися з ім'ям класу.

  • У Java не повинно бути типу конструктора, що повертається.

  • Єдині модифікатори для конструкторів:

    • public
    • default
    • protected
    • private
  • Конструктори можуть приймати будь-яку кількість параметрів.

  • Модифікатори final, synchronized, static і abstract у конструкторі неприпустимі.

  • Конструктор не підтримує оператора return всередині свого тіла.

  • У конструкторі можуть бути винятки з оператором throw .

  • Допустимо використовувати throws clause з конструктором.

  • Конструктор не повинен формувати рекурсію.

Коли ми можемо використовувати приватний конструктор?

Якщо ми не хочемо створювати об'єкти певного класу ззовні, ми можемо використовувати закриті або приватні конструктори. Оголосивши конструктори закритими, ми можемо створювати об'єкти лише усередині класу. Класи 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();
}
}
Наведений вище код надрукує:
Welcome to InterviewBit. Welcome to Scaler Academy by InterviewBit.
Ми отримаємо такий висновок, тому що якщо ми не вкажемо в конструкторі ключове слово super() або this() у першому рядку, то JVM сама автоматично помістить його під час виконання. JVM робить це тому, що він успадковується від іншого класу, і його функціональність також буде реалізована у похідному класі. Таким чином, присвоюючи екземплярам базового класу значення за промовчанням, JVM за промовчанням додає ключове слово super() .

Розгляньте код та вкажіть, чи є він дійсним (valid) чи недійсним (invalid). Поясніть причину

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 . Це створює рекурсію у конструкторі, що є неприпустимим. Відповідно ми отримаємо помилку часу компіляції, пов'язану з викликом рекурсивного конструктора.

Чи можемо ми використовувати два конструктори в одному класі 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.");
}
Такий код неприпустимий, тому що він сформує рекурсію. Конструктор без аргументів викличе конструктор із параметрами, а конструктор із параметрами викличе конструктор без аргументів.

Чи можемо ми перевизначити (override) конструктор Java?

Ні, концепція навантаження конструктора не застосовується у Java.

Чи може конструктор бути остаточним у Java?

Жодний конструктор не може бути остаточним (final). Це з тим, що ключові слова final використовуються зупинення перевизначення методу в похідному класі. Але в конструкторі концепція перевизначення не застосовується, тому не потрібно писати ключове слово final . Якщо ж ми напишемо ключове слово final в конструкторі, то отримаємо помилку часу компіляції під назвою required return type (потрібний тип, що повертається), тому що компілятор розглядає це як метод.

Чи може конструктор бути статичним у Java?

Ні, конструктор Java не може бути статичним. Це з тим, що ключові слова static використовуються, коли хочемо, щоб член належав класу, а чи не об'єкту. Але конструктори призначені для ініціалізації об'єктів, тому компілятор розглядатиме його як метод. Ми отримаємо помилку required return type .

Опишіть різницю між 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 надрукує повідомлення " Welcome to Scaler Academy ", а super.message надрукує " Welcome to InterviewBit ". Ось так ці два ключові слова використовуються для посилання на екземпляри членів базового та похідного класів.

Що таке деструктори? Чи існує деструктор у Java?

Destructors (Деструктори) використовуються для звільнення пам'яті, отриманої програмою. Наприклад, якщо пам'ять необхідна програмі під час її виконання, деструктор звільняє цю пам'ять, щоб її могли використовувати інші програми. У Java немає поняття деструктора, оскільки робота зі звільнення пам'яті Java обробляється збирачем сміття.

Що таке ланцюг конструкторів (constructor chaining) у Java?

Коли один конструктор викликається з іншого конструктора, можна назвати ланцюгом конструкторів (constructor chaining). Виклик конструктора не обов'язково потрібно виконувати для того самого класу. Це можна зробити і для батьківського класу. Для прикладу розгляньте зображення нижче. Кава-брейк #123.  Java Constructor - питання та відповіді на технічному співбесіді - 2Далі можна розглянути код для ініціалізації об'єкта зі значеннями значень (value values) цих змінних екземплярів:
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 . І за допомогою super(arguments) ми формуємо ланцюг конструкторів для ініціалізації значень. Ось що таке ланцюг конструкторів.

Визначте виведення програми за кодом та поясніть свою відповідь

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);
}
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ