Wprowadzenie do programu Static Constructor w Javie

Konstruktor statyczny to fragment kodu używany do inicjalizacji danych statycznych, co oznacza, że ​​określone zadanie musi zostać wykonane tylko raz w całym programie. Zwykle jest wywoływany automatycznie przed wygenerowaniem jakichkolwiek elementów statycznych lub wygenerowaniem pierwszej instancji. Konstruktor statyczny to taki, który jest jawnie zadeklarowany za pomocą słowa kluczowego „static”. Konstruktor nie może być statyczny, abstrakcyjny, końcowy, natywny, zsynchronizowany ani ściśle w Javie.

Mają kilka unikalnych funkcji, takich jak:

  • Konstruktor statyczny nie przyjmuje parametrów ani modyfikatorów dostępu.
  • Określona klasa może posiadać tylko jednego konstruktora statycznego.
  • Dziedziczenie lub przeładowanie nie jest dozwolone w konstruktorach statycznych.
  • Nie można go wywołać bezpośrednio, ponieważ zawsze jest wywoływany automatycznie.
  • Jeśli wartości inicjalizacji pól statycznych nie zostaną podane, inicjuje się do ich wartości domyślnej, jak w tabeli Wartości domyślne.

Składnia :

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

W tym miejscu próbujemy zadeklarować konstruktor w klasie, definiując go jako statyczny. Po skompilowaniu takiego kodu pojawia się komunikat o błędzie informujący, że dla konstruktora jest używany nielegalny modyfikator typu i dozwolone są tylko publiczne, chronione i prywatne.

Praca statycznego konstruktora w Javie

Konstruktory nie mogą być statyczne w Javie z następujących powodów:

W Javie metody statyczne i zmienne dotyczą klas. Ale konstruktor jest wywoływany, gdy nowy operator jest używany do utworzenia instancji. Ponieważ nie należy do klasy właściwości, nie może być statyczny. Jeśli konstruktor jest uważany za statyczny, nie można uzyskać do niego dostępu przez obiekt jego podklasy.

Ale jeśli konstruktor może być statyczny, można uzyskać do niego dostęp w klasie, ale nie przez jej podklasę. Nie można go również odziedziczyć, co oznacza, że ​​należą do klasy, którą zadeklarowano. Zezwalanie statycznemu konstruktorowi narusza całą koncepcję dziedziczenia, a zatem jest nielegalne.

Przykłady statycznego konstruktora w Javie

Możemy lepiej zrozumieć koncepcję Konstruktora statycznego w Javie w następujących przykładach:

Przykład 1

Kod:

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();
)
)

Wynik:

Tutaj pojawia się błąd czasu kompilacji informujący nas, że statyczny modyfikator nie jest dozwolony dla konstruktora Employee () w klasie Employee (), ponieważ wywołujemy to samo, tworząc nowy obiekt poniżej. Można to rozwiązać, nie deklarując go jako statyczny. Sprawdź poniższy przykład.

Przykład nr 2

Musimy stworzyć 2 klasy w tym samym pakiecie; ParentExample.java i ChildExample.java, która rozciąga się od klasy nadrzędnej.

Kod:

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();
)
)

Teraz uruchom ChildExample.java.

Wynik:

Obserwacje:

  • Zarówno klasa nadrzędna, jak i podrzędna mają domyślny konstruktor bez argumentów i wydrukowany komunikat, aby wyjaśnić przebieg wykonywania.
  • Konstruktor statyczny to pierwszy blok kodu uruchamiany w klasie, ponieważ są one wykonywane natychmiast po uruchomieniu wykonywania odpowiedniej klasy.
  • Podklasa zastępuje metodę display message () i drukuje komunikat.
  • Stworzyliśmy nowy obiekt klasy ChildExample, który wykonuje pierwszy konstruktor nadklasy, a następnie drugą podklasę.
  • W końcu wywoływana jest metoda wyświetlania nowo utworzonego obiektu w celu wyświetlenia komunikatu.
  • W takich przypadkach, w których implementowane jest dziedziczenie, konstruktory są wywoływane jawnie lub niejawnie. Dlatego należy uczynić go niestatycznym, aby był dostępny.
  • Gdy jest on statyczny, wówczas zostaje skojarzony z określoną klasą niż z jej instancjami, a zatem nie będzie dostępny podczas tworzenia obiektu.

Przykład nr 3

W tym przykładzie połączymy oba powyższe statyczne i niestatyczne konstruktory i sprawdzimy jego implementację.

Kod:

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();
)
)

Wynik:

Ograniczenia programu Static Constructor w Javie

Oto niektóre ograniczenia statycznego konstruktora w Javie podane poniżej:

  • Nazwy konstruktorów nie mogą być jednoznaczne i muszą być obowiązkowo takie same jak nazwa klasy. Ponieważ są one ograniczone do tych konwencji, nie można im nadać bardziej czytelnych nazw.
  • Za każdym razem, gdy trzeba wywołać konstruktor, należy utworzyć nowy obiekt. Wpływa to również na wydajność kodu, przez co spowalnia działanie.
  • Zwracane typy konstruktorów są ograniczone do zwracania tego samego typu, co obiekt.
  • Nie możemy używać konstruktorów statycznych w konstrukcji podklasy, ponieważ implementacja tylko konstruktorów nadklasy jest dozwolona.
  • Konstruktor statyczny nie pozwala na użycie słowa kluczowego „this” w celu uzyskania dostępu do instancji.
  • Wymagane są większe wysiłki w zakresie testowania w przypadku konstruktorów statycznych.

Wniosek

Głównym zadaniem konstruktora jest inicjowanie obiektu i jak widać z wszystkich powyższych przykładów, konstruktor nie może być statyczny z tego powodu, że nie można uzyskać do niego dostępu do obiektu podklasy i innych elementów niestatycznych. Alternatywą dla konstruktora statycznego jest użycie statycznych bloków kodu do zainicjowania zmiennych statycznych klasy.

Polecane artykuły

Jest to przewodnik po Static Constructor w Javie. Tutaj omawiamy działanie, ograniczenia i przykłady konstruktorów statycznych w Javie w Javie wraz z ich implementacją. Możesz także przejrzeć następujące artykuły, aby dowiedzieć się więcej -

  1. HashMap w Javie
  2. JavaFX FileChooser
  3. JavaFX TextField
  4. Przycisk JavaFX
  5. Przykłady metody statycznej JavaScript