Рубрики
Без рубрики

Почему статический конструктор Java не разрешен?

Статический конструктор Java, Почему конструктор не может быть статичным в java, альтернатива статическому конструктору Java, статический блок java, статический конструктор в коде java

Автор оригинала: Pankaj Kumar.

Статический конструктор Java не разрешен, но почему? Прежде чем мы углубимся в причины запрета статического конструктора, давайте посмотрим, что произойдет, если мы захотим сделать конструктор статичным.

Статический конструктор Java

Допустим, у нас есть класс, определенный как:

public class Data {

	private int id;
	
	public static Data() {}
}

Если вы попытаетесь скомпилировать этот класс, вы получите сообщение об ошибке как Незаконный модификатор для конструктора в типе данных; разрешены только общедоступные, защищенные и частные .

Почему статический конструктор не разрешен?

Давайте рассмотрим некоторые из причин, которые приводят убедительные аргументы в пользу запрета статического конструктора в java.

Статика принадлежит классу, Конструктор-объекту

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

Статический блок/метод не может получить доступ к нестатическим переменным

Мы знаем, что статические методы не могут получить доступ к нестатическим переменным. То же самое верно и для статического блока.

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

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

public static void main(String args[]) {
	System.out.println(this.id);
}

Статический конструктор нарушит наследование

В Java каждый класс неявно расширяет класс объектов. Мы можем определить иерархию классов, в которой конструктор подкласса вызывает конструктор суперкласса. Это делается с помощью вызова метода super () . В большинстве случаев JVM автоматически вызывает конструктор суперкласса, но иногда нам приходится вызывать их вручную, если в суперклассе несколько конструкторов.

Давайте рассмотрим пример использования super () .

package com.journaldev.util;

class Data {
	Data() {
		System.out.println("Data Constructor");
	}
}

public class DataChild extends Data{
	public DataChild() {
		super(); //JRE calls it explicitly, calling here for explanation
		System.out.println("DataChild Constructor");
	}
	
	public static void main(String args[]) {
		DataChild dc = new DataChild();
	}
}

Вышеприведенная программа выдаст следующий результат.

Data Constructor
DataChild Constructor

Если вы посмотрите на метод super () , он не статичен. Поэтому, если конструктор станет статичным, мы не сможем его использовать, и это нарушит наследование в java .

Альтернатива статическому конструктору Java

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

class Data {
	public static int count;
	
	static {
		count = 0;
	}
	Data(int c) {
		//not recommended since the count is class variable 
		//and shared among all the objects of the class
		count=c; 
	}
}

Резюме

Статический конструктор Java не разрешен, и у нас есть для этого очень веские причины. Мы можем инициализировать статические переменные с помощью статического блока, а также с помощью самого конструктора.