- Кофе-брейк #123. Java Constructor — вопросы и ответы на техническом собеседовании
- Зачем нужны конструкторы? Объясните подробно
- Какие типы конструкторов существуют в Java?
- Что такое Default Constructor в Java?
- Что такое No-Argument Constructor (Конструктор без аргументов)?
- Что такое Parameterized Constructor (Параметризованный конструктор)?
- Каковы правила определения конструктора?
- Когда мы можем использовать private (частный) конструктор?
- Каким будет модификатор доступа конструктора по умолчанию, если мы не определим его явно?
- Напишите вывод по приведенному ниже фрагменту кода и поясните
- Рассмотрите код и укажите, является ли он действительным (valid) или недействительным (invalid). Поясните причину
- Можем ли мы использовать два конструктора в одном классе в Java?
- Можем ли мы переопределить (override) конструктор в Java?
- Может ли конструктор быть окончательным (final) в Java?
- Может ли конструктор быть статическим (static) в Java?
- Опишите разницу между super(), super и this(), this
- Что такое деструкторы? Существует ли деструктор в Java?
- Что такое цепь конструкторов (constructor chaining) в Java?
- Определите вывод программы по коду и объясните свой ответ
- Default Constructor in Java
- What is Default Constructor in Java?
- Default Constructor Example
- Purpose of a Default Constructor
- Conclusion
Кофе-брейк #123. Java Constructor — вопросы и ответы на техническом собеседовании
Constructor — это специальный метод, определенный в классе с именем, совпадающим с именем класса. Конструктор Java подобен методу, не имеющему возвращаемого типа. Конструкторы играют наиболее важную роль при инициализации объектов, и в этой статье мы перечислим примерные вопросы на интервью, которые затрагивают конструкторы в Java. Также вы узнаете о важности конструкторов в Java, увидите примеры кода и другие важные детали, которые помогут вам ответить на вопросы о Java-конструкторах на собеседовании.
Зачем нужны конструкторы? Объясните подробно
Предположим, у нас есть класс с именем Student . И у нас есть имя переменной экземпляра и roll_number .
Теперь, если мы создадим 1000 объектов, то JVM инициализирует эти значения своим типом по умолчанию Name = null и rollNo = 0 . Идентификация этих отдельных объектов невозможна, а присвоение значений каждому из объектов увеличит объем кода, что считается плохой практикой в программировании. Поэтому, чтобы этого избежать, используются конструкторы. То есть, цель конструктора в Java состоит в том, чтобы инициализировать значение переменных экземпляра класса.
Какие типы конструкторов существуют в Java?
- Default Constructor (Конструктор по умолчанию)
- No-Argument Constructor (Конструктор без аргументов)
- Parameterized Constructor (Параметризованный конструктор)
Что такое Default Constructor в Java?
Конструктор по умолчанию (Default Constructor) — это конструктор, созданный JVM во время выполнения, если конструктор не определен в классе. Основная задача конструктора по умолчанию — инициализировать значения экземпляров в соответствии с их типом по умолчанию. Пример конструктора по умолчанию в Java:
Теперь для этого класса, если мы создадим объект, то внутри JVM появится конструктор по умолчанию, которому присвоено значение по умолчанию.
DefaultConstructor df= new DefaultConstructor();
Что такое No-Argument Constructor (Конструктор без аргументов)?
Конструктор без аргументов — это конструктор, который можно явно определить для инициализации значения экземпляров. Например:
Что такое 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
Когда мы можем использовать private (частный) конструктор?
Если мы не хотим создавать объекты определенного класса извне, мы можем использовать закрытые или частные (private) конструкторы. Объявив конструкторы закрытыми, мы можем создавать объекты только внутри класса. Классы 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(); >>
Мы получим такой вывод, потому что если мы не укажем в конструкторе ключевое слово 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() < 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?
Может ли конструктор быть окончательным (final) в Java?
Никакой конструктор не может быть окончательным (final). Это связано с тем, что ключевые слова final используются для остановки переопределения метода в производном классе. Но в конструкторе концепция переопределения неприменима, поэтому нет необходимости писать ключевое слово final . Если же мы напишем ключевое слово final в конструкторе, то получим ошибку времени компиляции под названием required return type (требуется возвращаемый тип), потому что компилятор рассматривает это как метод.
Может ли конструктор быть статическим (static) в 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). Вызов конструктора не обязательно нужно выполнять для одного и того же класса. Это можно сделать и для родительского класса. Для примера рассмотрите изображение ниже. Далее можно рассмотреть код для инициализации объекта со значениями значений (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 с данными о сотруднике и его адресом. Класс адреса 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 code">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); >
Default Constructor in Java
A default constructor in Java is created by the compiler itself when the programmer doesn't create any constructor. The purpose of the default constructor is to initialize the attributes of the object with their default values.
What is Default Constructor in Java?
A default constructor is created only when we don't declare any constructor in our code. Then, by default, the compiler automatically creates a default constructor.
Since we know the role of the constructor in Java, the question is, what will happen when there is no constructor available during object creation?
But firstly, we need to look at an important case where we try to access any variable without initialization. Here in this example, we'll be simply declaring the variables but won't initialize them with their default values.
Compilation error:
And indeed, this is what you might have expected. The above code has thrown multiple errors. Why? Because we didn't bother to initialize the variables with their default values. Also, these variables are declared within the static method, so these are static variables. It is important to provide static variables with their default values.
Now, we'll provide default values for them.
Now, the code is working properly. So, the above example highlighted a common mistake that we, as programmers, might do while creating objects as well.
Instance variables are the ones declared as a property of a class but outside of constructors, methods, or blocks of the class.
So, initializing the instance variables is also mandatory. Here comes the role of a default constructor in Java that assigns these instance variables with their default values.
Note: We usually call the default constructor a no-arg constructor but they are not actually the same. A no-arg constructor is still a constructor created by the user and not by the compiler. Although they both have the same purpose, one is created automatically while the other is created by the user.
Default Constructor Example
Let us take an example of a product that comprises data such as id , product_name , and also price .
Notice what happens when no constructor is declared in the code by a programmer, and still, we are trying to access the instance variables.
It works! The above code didn't throw any error because the Java compiler provided a default constructor for the code to initialize the attributes with default values. Yes, this default constructor is invisible.
Purpose of a Default Constructor
As discussed above, the purpose of the default constructor is to provide the default values to the object. An integer will be initialized with 0 0 0 , double with 0 . 0 0.0 0 . 0 , boolean with f a l s e false f a l s e , and String with n u l l null n u l l . It depends on the type of instance variable declared in the class from which an object is created.
Let's consider another case where we'll create a parameterized constructor.
Compilation error:
We have created a parameterized constructor in our code, and we are trying to access the default constructor. It throws an error .
Note: When we create any constructor manually, then the compiler will not insert the default constructor. So, we'll also have to create the default constructor manually, if needed.
If we have created a parameterized constructor on our own and by any chance, we tried to call the default constructor, then it is our responsibility to also create our own default constructor as well.
But yes, this only occurs when we call the default constructor, whereas we have created parameterized constructor only. You can see the same in the code given below.
The problem didn't occur here because we neither created nor called the default constructor. We had a parameterized constructor and we are just calling it, so there isn't any need for default constructor.
Conclusion
- A default constructor in Java is created automatically by the online Java compiler when the programmer doesn't create any constructor in the entire program.
- It is created to assign the default values to the instance variables of the class when an object is created.
- Default constructors are sometimes called no-arg constructors since they both work the same. But no-arg constructor is created by the user while default constructor can only be created by the compiler.