Въведение в статичния конструктор на Java
Статичният конструктор е част от кода, използван за инициализиране на статични данни, което означава, че определена задача трябва да се изпълни само веднъж в цялата програма. Обикновено се извиква автоматично, преди да се генерират всички статични членове, посочени или първа инстанция. Статичен конструктор е този, който е изрично деклариран с помощта на „статичната“ ключова дума. Конструкторът не е позволен да бъде статичен, абстрактен, финален, нативен, синхронизиран или строг Fp в Java.
Те имат няколко уникални функции, както следва:
- Параметрите или модификаторите на достъп не се вземат от статичен конструктор.
- Конкретният клас може да притежава само един статичен конструктор.
- Наследяването или претоварването не е разрешено в статични конструктори.
- Не може да бъде извикан директно, тъй като винаги се извиква автоматично.
- Ако стойностите за инициализация на статичните полета не са предоставени, то тя се инициализира до стойността им по подразбиране, както в таблицата със стойности по подразбиране.
Синтаксис :
public class (
private ;
public static () ()
)
Тук се опитваме да обявим конструктор в класа, като го определяме като статичен. Когато се компилира такъв код, получаваме съобщение за грешка, в което се посочва, че незаконосъобразният модификатор се използва за конструктора по вид и са разрешени само публични, защитени и частни.
Работа на статичен конструктор в Java
Конструкторите не могат да бъдат статични в Java поради следната причина:
В Java статичните методи и променливи се прилагат към класовете. Но конструктор се извиква, когато се използва нов оператор за създаване на екземпляр. Тъй като не принадлежи към класа на свойствата, не е позволено да бъде статичен. Ако в случай, че конструктор се счита за статичен, той не може да бъде достъпен от обект от неговия подклас.
Но ако на конструктора е позволено да е статичен, тогава той може да бъде достъпен в класа, но не и от неговия подклас. Той също не може да бъде наследен, което означава, че принадлежат към класа, за който са декларирани. Разрешаването на статичен конструктор нарушава цялата концепция за наследство, следователно е незаконно.
Примери за статичен конструктор в Java
Можем да разберем по-добре концепцията на Static Constructor в 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.
изход:
Наблюдения:
- И класът родител и дете имат конструктори по подразбиране без аргументи и отпечатано съобщение, за да се изчисти процесът на изпълнение.
- Статичният конструктор е първият блок код, който се изпълнява в класа, тъй като те се изпълняват веднага, когато съответното изпълнение на класата започне.
- Подкласът отменя метода на дисплейното съобщение () и отпечатва съобщението.
- Създадохме нов обект от класа 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, дадени по-долу:
- Имената на конструктора не могат да бъдат категорични и трябва задължително да са същите като името на неговия клас. Тъй като те са ограничени до тези конвенции, не могат да им се дават по-четими имена.
- Всеки път, когато трябва да бъде извикан конструктор, трябва да се създаде нов обект. Това също се отразява на производителността на кода, като по този начин го прави бавен.
- Обратните типове конструктори са ограничени да връщат същия тип като този на обекта.
- Не можем да използваме статични конструктори в конструкцията на подклас, тъй като е позволено прилагането само на конструктори на суперклас.
- Статичният конструктор не позволява използването на тази дума за достъп до инстанция.
- Необходимите усилия за тестване са повече, когато участват статични конструктори.
заключение
Основната задача на конструктора е да инициализира обект и както се вижда от всички по-горе примери, конструктор не е позволено да бъде статичен поради основната причина, че обектът на подклас и други нестатични членове не могат да бъдат достъпни от него. Алтернативата на статичния конструктор е чрез използване на статични блокове от кодове за инициализиране на статични променливи на клас.
Препоръчителни статии
Това е ръководство за статичен конструктор в Java. Тук обсъждаме работата, ограниченията и примерите на статични конструктори в java in java заедно с тяхното изпълнение. Можете също да разгледате следните статии, за да научите повече -
- HashMap в Java
- JavaFX FileChooser
- JavaFX TextField
- JavaFX бутон
- Примери за статичен метод на JavaScript