Введение в статический конструктор в Java

Статический конструктор - это фрагмент кода, используемый для инициализации статических данных, что означает, что конкретная задача должна быть выполнена только один раз по всей программе. Обычно он вызывается автоматически перед тем, как на какие-либо статические элементы ссылаются или генерируется первый экземпляр. Статический конструктор - это тот, который явно объявлен с использованием ключевого слова «static». Конструктор не может быть статическим, абстрактным, окончательным, собственным, синхронизированным или строгим в Java.

У них есть несколько уникальных особенностей:

  • Параметры или модификаторы доступа не принимаются статическим конструктором.
  • Определенный класс может иметь только один статический конструктор.
  • Наследование или перегрузка недопустимы в статических конструкторах.
  • Его нельзя вызвать напрямую, поскольку он всегда вызывается автоматически.
  • Если значения инициализации статических полей не предоставлены, то они инициализируются до их значения по умолчанию, как в таблице значений по умолчанию.

Синтаксис :

public class (
private ;
public static () ()
)

Здесь мы пытаемся объявить конструктор в классе, определив его как статический. Когда такой код компилируется, мы получаем сообщение об ошибке, в котором говорится, что модификатор Illegal используется для конструктора в типе, и разрешены только public, protected и private.

Работа статического конструктора в Java

Конструкторам не разрешается быть статичными в Java по следующей причине:

В Java статические методы и переменные применяются к классам. Но конструктор вызывается, когда новый оператор используется для создания экземпляра. Поскольку он не принадлежит классу свойств, он не может быть статическим. Если в случае, если конструктор считается статическим, к нему не может получить доступ объект его подкласса.

Но если конструктору разрешено быть статическим, то к нему можно получить доступ внутри класса, но не через его подкласс. Это также не может быть унаследовано, что означает, что они принадлежат к классу, который они объявили. Разрешение статического конструктора нарушает всю концепцию наследования, следовательно, это незаконно.

Примеры статического конструктора в Java

Мы можем лучше понять концепцию статического конструктора в Java в следующих примерах:

Пример № 1

Код:

public class Employee (
//Initialising variables for employee name and ID
public String emp_name;
public int emp_id;
//Declaration of the static constructor
public static Employee()(
System.out.println("Printing Constructor of the Employee class");
)
//Declaring method to print message
public void displayMsg()(
System.out.println("Employee Name is: "+this.emp_name );
System.out.println("Employee ID is: "+this.emp_id );
)
public static void main(String args()) (
//Creating a new object to call the display message constructor
new Employee().displayMsg();
)
)

Выход:

Здесь мы получаем ошибку времени компиляции, говорящую нам, что статический модификатор недопустим для конструктора Employee () внутри класса Employee (), так как мы вызываем его, создавая новый объект ниже. Это можно решить, не объявляя это как статическое. Проверьте пример ниже для того же самого.

Пример № 2

Мы должны создать 2 класса внутри одного пакета; ParentExample.java и ChildExample.java, который расширяется от своего родительского класса.

Код:

ParentExample.java:

public class ParentExample (
ParentExample()(
super();
System.out.println("Printing Super constructor inside Parent class");
)
void displayMessage()(
System.out.println("Printing inside display Message class");
)
)

ChildExample.java:

public class ChildExample extends ParentExample (
ChildExample()(
super();
System.out.println("Printing super constructor inside child class");
)
@Override
void displayMessage()(
System.out.println("Printing display message inside Parent example");
)
public static void main(String() args)(
ChildExample childexample = new ChildExample();
childexample.displayMessage();
)
)

Теперь запустите ChildExample.java.

Выход:

Замечания:

  • Классы Parent и Child имеют конструкторы по умолчанию без аргументов и распечатанное сообщение, чтобы сделать процесс выполнения понятным.
  • Статический конструктор - это первый блок кода, который запускается в классе, поскольку они выполняются сразу же, когда начинается выполнение соответствующего класса.
  • Подкласс переопределяет метод display message () и печатает сообщение.
  • Мы создали новый объект класса ChildExample, который выполняет первый конструктор суперкласса, а затем второй подкласс.
  • Наконец, метод отображения вновь созданного объекта вызывается для отображения сообщения.
  • В тех случаях, когда реализовано наследование, конструкторы вызываются явно или неявно. Следовательно, он должен быть нестатичным, чтобы он был доступен.
  • Когда он сделан статическим, он связывается с конкретным классом, а не с его экземплярами, и, следовательно, не будет доступен во время создания объекта.

Пример № 3

В этом примере мы объединим оба статических и нестатических конструкторов и проверим их реализацию.

Код:

class ParentClass(
private static String message= "Test message";
// Declaring a nested static class
public static class StaticNestedClass(
// In the nested class only static members belonging to parent class can be accessed
// in a static nested class
public void displayprint() (
// We get a compiler error if we try and make this message
// a non-static variable
System.out.println("Displaying from nested class: " + message);
)
)
// Declaring Inner class or also called non-static nested class
public class ChildClass(
// The static and non-static constructor both can be accessed in
// this Child class
public void displayprint()(
System.out.println("Printing from static non-nested class: "+ message);
)
)
)
class Main
(
public static void main(String args())(
// Instance of static nested class creation
ParentClass.StaticNestedClass printer = new ParentClass.StaticNestedClass();
//Calling the non-static constructor of static nested class
printer.displayprint();
// Creating Parent class instance first in order
//to create the child class instance
ParentClass outer = new ParentClass();
ParentClass.ChildClass inner = outer.new ChildClass();
// Here we call the non-static method of Child class
inner.displayprint();
// Creation of instance for child class in one line
//by combining above 2 lines
ParentClass.ChildClass innerObject = new ParentClass().new ChildClass();
// Now we call the child method
innerObject.displayprint();
)
)

Выход:

Ограничения статического конструктора в Java

Вот некоторые ограничения статического конструктора в Java, приведенные ниже:

  • Имена конструктора не могут быть явными и должны обязательно совпадать с именем класса. Поскольку они ограничены этими соглашениями, им нельзя давать более читаемые имена.
  • Каждый раз, когда нужно вызвать конструктор, нужно создать новый объект. Это также влияет на производительность кода, что делает его медленным.
  • Типы возврата конструкторов ограничены, чтобы возвращать тот же тип, что и у объекта.
  • Мы не можем использовать статические конструкторы в построении подкласса, так как допускается реализация только конструкторов суперкласса.
  • Статический конструктор не позволяет использовать ключевое слово «this» для доступа к экземпляру.
  • Требуемые усилия по тестированию больше, когда участвуют статические конструкторы.

Вывод

Основная задача конструктора заключается в инициализации объекта, и, как видно из всех приведенных выше примеров, конструктору не разрешается быть статическим по основной причине, по которой он не может получить доступ к объекту подкласса и другим нестатическим членам. Альтернативой статическому конструктору является использование статических блоков кода для инициализации статических переменных класса.

Рекомендуемые статьи

Это руководство по статическому конструктору в Java. Здесь мы обсуждаем работу, ограничения и примеры статических конструкторов в Java в Java, а также их реализацию. Вы также можете посмотреть следующие статьи, чтобы узнать больше:

  1. HashMap в Java
  2. JavaFX FileChooser
  3. JavaFX TextField
  4. Кнопка JavaFX
  5. Примеры статического метода JavaScript