what is static keyword java
Ten samouczek wyjaśnia statyczne słowo kluczowe w Javie i jego użycie w zmiennych, metodach, blokach i klasach. Wskazuje również różnicę między statycznymi i niestatycznymi składnikami:
Java obsługuje różne typy deklaracji, aby wskazać zakres i zachowanie jej zmiennych, metod, klas itp. Na przykład, słowo kluczowe final, seal, static itp. Wszystkie te deklaracje mają określone znaczenie, gdy są używane w programie Java.
W dalszej części tego samouczka zbadamy wszystkie te słowa kluczowe. Tutaj omówimy szczegóły jednego z najważniejszych słów kluczowych w Javie, czyli „statyczny”.
Czego się nauczysz:
- Statyczne słowo kluczowe w Javie
- Wniosek
Statyczne słowo kluczowe w Javie
Element w programie Java można zadeklarować jako statyczny za pomocą słowa kluczowego „static” poprzedzającego jego deklarację / definicję. Gdy element członkowski jest zadeklarowany jako statyczny, oznacza to zasadniczo, że jest on współdzielony przez wszystkie wystąpienia klasy bez tworzenia kopii dla każdego wystąpienia.
W związku z tym static jest modyfikatorem niebędącym klasą używanym w Javie i można go zastosować do następujących elementów członkowskich:
- Zmienne
- Metody
- Bloki
- Klasy (a dokładniej klasy zagnieżdżone)
Gdy element członkowski jest zadeklarowany jako statyczny, można uzyskać do niego dostęp bez użycia obiektu. Oznacza to, że przed utworzeniem wystąpienia klasy statyczny element członkowski jest aktywny i dostępny. W przeciwieństwie do innych niestatycznych członków klasy, które przestają istnieć, gdy obiekt klasy wychodzi poza zakres, statyczny element członkowski jest nadal oczywiście aktywny.
Zmienna statyczna w Javie
Zmienna składowa klasy zadeklarowanej jako statyczna jest nazywana zmienną statyczną. Nazywa się ją również „zmienną klasy”. Po zadeklarowaniu zmiennej jako statycznej pamięć jest przydzielana tylko raz i nie za każdym razem, gdy tworzona jest instancja klasy. Dlatego możesz uzyskać dostęp do zmiennej statycznej bez odniesienia do obiektu.
Poniższy program Java przedstawia użycie zmiennych statycznych:
class Main { // static variables a and b static int a = 10; static int b; static void printStatic() { a = a /2; b = a; System.out.println('printStatic::Value of a : '+a + ' Value of b : '+b); } public static void main(String() args) { printStatic(); b = a*5; a++; System.out.println('main::Value of a : '+a + ' Value of b : '+b); } }
Wynik:
W powyższym programie mamy dwie zmienne statyczne czyli a i b. Zmienne te modyfikujemy zarówno w funkcji „printStatic”, jak i „main”. Zwróć uwagę, że wartości tych zmiennych statycznych są zachowywane w funkcjach, nawet gdy kończy się zakres funkcji. Dane wyjściowe pokazują wartości zmiennych w dwóch funkcjach.
Dlaczego potrzebujemy zmiennych statycznych i gdzie są przydatne?
Zmienne statyczne są najbardziej przydatne w aplikacjach wymagających liczników. Jak wiesz, liczniki podają błędne wartości, jeśli zostaną zadeklarowane jako normalne zmienne.
Na przykład, jeśli masz normalną zmienną ustawioną jako licznik w aplikacji, która ma klasę, powiedz samochód. Następnie za każdym razem, gdy utworzymy obiekt samochodu, normalna zmienna licznika zostanie zainicjowana z każdą instancją. Ale jeśli mamy zmienną licznika jako zmienną statyczną lub klasową, zostanie ona zainicjowana tylko raz, gdy klasa zostanie utworzona.
Później, przy każdym wystąpieniu klasy, licznik ten będzie zwiększany o jeden. W przeciwieństwie do zwykłej zmiennej, w której z każdym wystąpieniem licznik będzie zwiększany, ale wartość licznika zawsze będzie wynosić 1.
Stąd nawet jeśli utworzysz sto obiektów klasy samochodu, to licznik jako normalna zmienna zawsze będzie miał wartość 1, podczas gdy przy zmiennej statycznej będzie pokazywał poprawną liczbę 100.
Poniżej podano kolejny przykład liczników statycznych w Javie:
class Counter { static int count=0;//will get memory only once and retain its value Counter() { count++;//incrementing the value of static variable System.out.println(count); } } class Main { public static void main(String args()) { System.out.println('Values of static counter:'); Counter c1=new Counter(); Counter c2=new Counter(); Counter c3=new Counter(); } }
Wynik:
Działanie zmiennej statycznej jest widoczne w powyższym programie. Zadeklarowaliśmy liczbę zmiennych statycznych z wartością początkową = 0. Następnie w konstruktorze klasy inkrementujemy zmienną statyczną.
W funkcji głównej tworzymy trzy obiekty licznika klas. Dane wyjściowe pokazują wartość zmiennej statycznej za każdym razem, gdy tworzony jest obiekt licznika. Widzimy, że z każdym utworzonym obiektem wartość istniejącej zmiennej statycznej jest zwiększana i nie jest ponownie inicjowana.
Metoda statyczna Java
Metoda w Javie jest statyczna, gdy jest poprzedzona słowem kluczowym „static”.
Niektóre punkty, o których musisz pamiętać w przypadku metody statycznej, to:
jak otworzyć nowy projekt w Eclipse
- Metoda statyczna należy do klasy w przeciwieństwie do innych metod niestatycznych, które są wywoływane przy użyciu wystąpienia klasy.
- Aby wywołać metodę statyczną, nie potrzebujesz obiektu klasy.
- Statyczne elementy członkowskie klasy są dostępne dla metody statycznej. Metoda statyczna może nawet zmienić wartości statycznego elementu członkowskiego danych.
- Metoda statyczna nie może mieć odniesienia do elementów „this” ani „super”. Nawet jeśli metoda statyczna spróbuje je odesłać, będzie to błąd kompilatora.
- Podobnie jak dane statyczne, metoda statyczna może również wywoływać inne metody statyczne.
- Metoda statyczna nie może odwoływać się do niestatycznych elementów członkowskich danych lub zmiennych, a także nie może wywoływać metod niestatycznych.
Poniższy program przedstawia implementację metody statycznej w Javie:
class Main { // static method static void static_method() { System.out.println('Static method in Java...called without any object'); } public static void main(String() args) { static_method(); } }
Wynik:
To jest prosta ilustracja. Definiujemy statyczną metodę, która po prostu drukuje wiadomość. Następnie w funkcji głównej metoda statyczna jest wywoływana bez żadnego obiektu lub instancji klasy.
Kolejny przykład implementacji statycznego słowa kluczowego w Javie.
class Main { // static variable static int count_static = 5; // instance variable int b = 10; // static method static void printStatic() { count_static = 20; System.out.println('static method printStatic'); // b = 20; // compilation error 'error: non-static variable b cannot be referenced from a static context' //inst_print(); // compilation error 'non-static method inst_print() cannot be referenced from a static //context' //System.out.println(super.count_static); // compiler error 'non-static variable super cannot be //referenced from a static context' } // instance method void inst_print() { System.out.println('instance method inst_print'); } public static void main(String() args) { printStatic(); } }
W powyższym programie, jak widać, mamy dwie metody. Metoda printStatic jest metodą statyczną, podczas gdy inst_print jest metodą instancji. Mamy również dwie zmienne, static_count to zmienna statyczna, a b to zmienna instancji.
W metodzie statycznej - printStatic, najpierw wyświetlamy komunikat, a następnie próbujemy zmienić wartość zmiennej instancji b, a także wywołać metodę niestatyczną.
Następnie próbujemy użyć słowa kluczowego „super”.
b = 20;
inst_print ();
System.out.println (super.count_static);
Kiedy wykonujemy program z powyższymi wierszami, otrzymujemy błędy kompilacji dotyczące używania zmiennych instancji, wywoływania metod niestatycznych i odwoływania się do super w kontekście statycznym. To są ograniczenia metody statycznej.
Kiedy komentujemy powyższe trzy linie, tylko wtedy powyższy program działa dobrze i generuje następujące dane wyjściowe.
Wynik:
Przeciążanie i zastępowanie metody statycznej
Jak wszyscy wiecie, zarówno przeciążanie, jak i zastępowanie są cechami OOPS i pomagają w polimorfizmie. Przeciążanie można sklasyfikować jako polimorfizm w czasie kompilacji, w którym metody mogą mieć tę samą nazwę, ale różne listy parametrów.
Zastępowanie jest cechą polimorfizmu w czasie wykonywania iw tym przypadku metoda klasy bazowej jest nadpisywana w klasie pochodnej, dzięki czemu sygnatura lub prototyp metody jest taka sama, ale inna jest definicja.
Omówmy, jak przeciążanie i zastępowanie wpływają na klasę statyczną w Javie.
Przeciążenie
Możesz przeciążać statyczną metodę w Javie z różnymi listami parametrów, ale o tej samej nazwie.
Poniższy program pokazuje Przeciążenie:
public class Main { public static void static_method() { System.out.println('static_method called '); } public static void static_method(String msg) { System.out.println('static_method(string) called with ' + msg); } public static void main(String args()) { static_method(); static_method('Hello, World!!'); } }
Wynik:
Ten program ma dwie statyczne metody o tej samej nazwie „static_method”, ale z inną listą argumentów. Pierwsza metoda nie przyjmuje żadnego argumentu, a druga metoda przyjmuje argument typu string.
Należy zauważyć, że nie można przeciążać metody w zależności od słowa kluczowego „static”. Na przykład, jeśli masz metodę instancji „sum” i zdefiniujesz inną metodę „sum” i zadeklarujesz ją jako statyczną, to nie zadziała. Ta próba przeciążenia na podstawie „statycznego” słowa kluczowego zakończy się niepowodzeniem kompilacji.
Nadrzędny
Ponieważ metody statyczne są wywoływane bez żadnego obiektu klasy, nawet jeśli w klasie pochodnej istnieje metoda statyczna z tym samym podpisem, nie będzie ona zastępowana. Dzieje się tak, ponieważ nie ma polimorfizmu w czasie wykonywania bez instancji.
Dlatego nie można przesłonić metody statycznej. Ale jeśli w ogóle istnieje metoda statyczna z tym samym podpisem w klasie pochodnej, to metoda do wywołania nie zależy od obiektów w czasie wykonywania, ale zależy od kompilatora.
Należy zauważyć, że chociaż metod statycznych nie można przesłonić, język Java nie generuje żadnych błędów kompilatora, jeśli w klasie pochodnej istnieje metoda o takiej samej sygnaturze jak metoda klasy bazowej.
Dowodzi tego następująca implementacja.
classBase_Class { // Static method in base class which will be hidden in substatic_displayclass public static void static_display() { System.out.println('Base_Class::static_display'); } } classDerived_Class extends Base_Class { public static void static_display() { System.out.println('Derived_Class::static_display'); } } public class Main { public static void main(String args( )) { Base_Class obj1 = new Base_Class(); Base_Class obj2 = new Derived_Class(); Derived_Class obj3 = new Derived_Class(); obj1.static_display(); obj2.static_display(); obj3.static_display(); } }
Wynik:
najlepsza strona do oglądania darmowego anime
W powyższym programie widać, że wywoływana metoda statyczna nie zależy od tego, na który obiekt wskazuje wskaźnik. Dzieje się tak, ponieważ obiekty nie są w ogóle używane z metodami statycznymi.
Blok statyczny w Javie
Podobnie jak w przypadku bloków funkcyjnych w językach programowania, takich jak C ++, C # itp., W Javie istnieje specjalny blok zwany blokiem „statycznym”, który zwykle zawiera blok kodu związany z danymi statycznymi.
Ten blok statyczny jest wykonywany w momencie, gdy tworzony jest pierwszy obiekt klasy (dokładnie w momencie ładowania klasy) lub gdy używany jest statyczny element członkowski wewnątrz bloku.
Poniższy program przedstawia użycie bloku statycznego.
class Main { static int sum = 0; static int val1 = 5; static int val2; // static block static { sum = val1 + val2; System.out.println('In static block, val1: ' + val1 + ' val2: '+ val2 + ' sum:' + sum); val2 = val1 * 3; sum = val1 + val2; } public static void main(String() args) { System.out.println('In main function, val1: ' + val1 + ' val2: '+ val2 + ' sum:' + sum); } }
Wynik:
Zwróć uwagę na kolejność wykonywania instrukcji w powyższym programie. Najpierw wykonywana jest zawartość bloku statycznego, a następnie program główny. Zmienne statyczne sum i val1 mają wartości początkowe, podczas gdy val2 nie jest inicjowany (domyślnie wynosi 0). Wtedy w bloku statycznym val2 nadal nie ma przypisanej wartości i dlatego jego wartość jest wyświetlana jako 0.
Zmiennej val2 przypisywana jest wartość po wydrukowaniu w bloku statycznym i suma jest przeliczana. Dlatego w funkcji głównej otrzymujemy różne wartości sum i val2.
Jeśli określisz konstruktora, zawartość bloku statycznego jest wykonywana nawet przed konstruktorem. Bloki statyczne są najczęściej używane do inicjowania statycznych elementów członkowskich klasy i innych inicjalizacji związanych ze statycznymi składowymi.
Klasa statyczna Java
W Javie masz statyczne bloki, statyczne metody, a nawet statyczne zmienne. Dlatego jest oczywiste, że możesz mieć również klasy statyczne. W Javie możliwe jest umieszczenie klasy wewnątrz innej klasy i nazywa się to klasą zagnieżdżoną. Klasa, która obejmuje klasę zagnieżdżoną, nosi nazwę klasy Outer.
W Javie, chociaż można zadeklarować klasę zagnieżdżoną jako statyczną, nie jest możliwe, aby klasa zewnętrzna była statyczna.
Przyjrzyjmy się teraz statycznym klasom zagnieżdżonym w Javie.
Statyczna klasa zagnieżdżona w Javie
Jak już wspomniano, możesz zadeklarować klasę zagnieżdżoną w Javie jako statyczną. Statyczna klasa zagnieżdżona różni się od niestatycznej klasy zagnieżdżonej (klasa wewnętrzna) w pewnych aspektach, które wymieniono poniżej.
W przeciwieństwie do niestatycznej klasy zagnieżdżonej, zagnieżdżona klasa statyczna nie wymaga odwołania do klasy zewnętrznej.
Pliki .torrent Jak otworzyć
Statyczna klasa zagnieżdżona może uzyskać dostęp tylko do statycznych elementów członkowskich klasy zewnętrznej, w przeciwieństwie do klas niestatycznych, które mogą uzyskiwać dostęp do statycznych i niestatycznych elementów członkowskich klasy zewnętrznej.
Poniżej przedstawiono przykład statycznej klasy zagnieżdżonej.
class Main{ private static String str = 'SoftwareTestingHelp'; //Static nested class static class NestedClass{ //non-static method public void display() { System.out.println('Static string in OuterClass: ' + str); } } public static void main(String args()) { Main.NestedClassobj = new Main.NestedClass(); obj.display(); } }
Wynik:
W powyższym programie widać, że statyczna klasa zagnieżdżona może uzyskać dostęp do zmiennej statycznej (ciągu znaków) z klasy zewnętrznej.
Statyczny import w Javie
Jak wiecie, zazwyczaj dołączamy różne pakiety i predefiniowane funkcje do programu Java za pomocą dyrektywy „import”. Użycie słowa static z dyrektywą import umożliwia korzystanie z funkcji klasy bez używania nazwy klasy.
Przykład:
import static java.lang.System.*; class Main { public static void main(String() args) { //here we import System class using static, hence we can directly use functionality out.println('demonstrating static import'); } }
Wynik:
W tym programie używamy importu statycznego dla klasy java.lang.System.
Uwaga: W funkcji głównej właśnie użyliśmy out.println do wyświetlenia wiadomości.
Chociaż funkcja importu statycznego sprawia, że kod jest bardziej zwięzły i czytelny, czasami tworzy niejednoznaczność, zwłaszcza gdy niektóre pakiety mają te same funkcje. Dlatego import statyczny powinien być używany tylko wtedy, gdy jest to wyjątkowo potrzebne.
Statyczne vs niestatyczne
Omówmy główne różnice między statycznymi i niestatycznymi elementami Javy.
Poniżej wymienione są różnice między Zmienne statyczne i niestatyczne .
Zmienne statyczne | Zmienne niestatyczne |
---|---|
Można uzyskać do niego dostęp tylko za pomocą nazwy klasy. | Wymaga obiektów klasy, aby uzyskać dostęp. |
Są dostępne zarówno dla metod statycznych, jak i niestatycznych. | Są dostępne tylko dla metod niestatycznych. |
Pamięć dla zmiennej statycznej jest przydzielana tylko raz na klasę. | Pamięć na zmienne niestatyczne jest przydzielana na obiekt. |
Współdzielone przez wszystkie obiekty klasy. | Tworzona jest kopia zmiennej na obiekt. |
Ma zasięg globalny i jest dostępny dla wszystkich metod i bloków. | Ma zasięg lokalny i jest widoczny dla obiektów klasy. |
Poniżej podano różnicę między metodami statycznymi i niestatycznymi .
Metody statyczne | Metody niestatyczne |
---|---|
Metoda, która jest poprzedzona statycznym słowem kluczowym i jest dostępna na poziomie klasy. | Metoda nie poprzedzona słowem kluczowym static i dostępna dla każdego wystąpienia klasy. |
Obsługuje czas kompilacji lub wczesne wiązanie. | Obsługuje wiązanie w czasie wykonywania lub dynamiczne wiązanie. |
Ma dostęp tylko do statycznych elementów składowych danych swojej klasy i dowolnej innej klasy. | Może uzyskać dostęp do statycznych i niestatycznych elementów członkowskich klasy i innych klas. |
Metody statyczne nie mogą zostać zastąpione. | Można zmienić. |
Pamięć jest przydzielana tylko raz. W związku z tym zużyta pamięć jest mniejsza. | Zużycie pamięci jest większe, ponieważ pamięć jest przydzielana za każdym razem, gdy wywoływana jest metoda. |
Static vs Final
Static i Final to dwa słowa kluczowe w Javie, które mogą nadać specjalne znaczenie jednostce, z którą są używane. Na przykład, gdy zmienna jest zadeklarowana jako statyczna, staje się zmienną klasową, do której można uzyskać dostęp bez odniesienia do obiektu.
Podobnie, gdy zmienna jest zadeklarowana jako ostateczna, staje się niezmienna, tj. Stała.
Przedstawmy w tabeli niektóre z głównych różnic między statycznymi i końcowymi słowami kluczowymi w Javie.
Statyczny | Finał |
---|---|
Statyczny element członkowski danych (zagnieżdżona klasa, zmienna lub metoda) to element członkowski danych poprzedzony statycznym słowem kluczowym, do którego można uzyskać dostęp bez obiektu. | Ostatnie słowo kluczowe można zastosować do zmiennej, metody, klasy itp. i nakłada ograniczenia na podmioty. |
Nie jest obowiązkowe, aby zainicjować zmienną statyczną wartością podczas deklaracji. | Wymagane jest, aby końcowa zmienna została zainicjowana do wartości w momencie deklaracji |
Możesz ponownie zainicjować zmienne statyczne. | Nie można ponownie zainicjować zmiennych końcowych. |
Metody statyczne to te, które mają dostęp tylko do statycznych elementów członkowskich. | Ostateczne metody to metody, których nie można odziedziczyć / nadpisać. |
Klasy statyczne to klasy, których obiektów nie można tworzyć. | Klasy końcowe to klasy, których nie można dziedziczyć. |
Często Zadawane Pytania
P # 1) Czy klasa Java może być statyczna?
Odpowiedź: Tak, klasa w Javie może być statyczna, pod warunkiem, że nie jest klasą zewnętrzną. Oznacza to, że tylko klasy zagnieżdżone w Javie mogą być statyczne.
Q # 2) Kiedy należy używać statycznej w Javie?
Odpowiedź: Jeśli chcesz, aby w programie znajdował się element członkowski danych, który powinien zachować swoją wartość w obiektach, powinieneś użyć statycznego. Na przykład, licznik. Metodę można zadeklarować jako statyczną, jeśli nie chcesz jej wywoływać za pomocą obiektu.
P # 3) Czy klasa statyczna może mieć konstruktora?
Odpowiedź: Tak, klasa statyczna może mieć konstruktora, a jej celem jest wyłącznie inicjowanie statycznych elementów członkowskich danych. Zostanie wywołany tylko po raz pierwszy, gdy uzyskasz dostęp do członków danych. Nie będzie wywoływana przy późniejszym dostępie.
P # 4) Jakie jest zastosowanie statycznego konstruktora?
Odpowiedź: Ogólnie konstruktor służy do inicjowania statycznych elementów członkowskich danych. Służy również do wykonywania operacji / czynności, które należy wykonać tylko raz.
Pytanie 5) Czy metody statyczne są dziedziczone w Javie?
Odpowiedź: Tak, metody statyczne w Javie są dziedziczone, ale nie są nadpisywane.
Wniosek
W tym samouczku szczegółowo omówiliśmy statyczne słowo kluczowe języka Java oraz jego użycie w składowych danych, metodach, blokach i klasach. Słowo kluczowe static jest słowem kluczowym używanym do wskazania poziomu klasy lub zakresu globalnego.
Nie musisz uzyskiwać dostępu do statycznych elementów członkowskich przy użyciu instancji klasy. Możesz uzyskać bezpośredni dostęp do statycznych elementów członkowskich za pomocą nazwy klasy. Omówiliśmy również główne różnice między statycznymi i niestatycznymi elementami członkowskimi, a także statycznymi i końcowymi słowami kluczowymi.
W kolejnych tematach omówimy więcej słów kluczowych i ich znaczenie w języku Java.
rekomendowane lektury
- Statyczny w C ++
- Interfejs Java i samouczek klasy abstrakcyjnej z przykładami
- Wdrażanie Java: tworzenie i wykonywanie pliku Java JAR
- Wirtualna maszyna Java: jak JVM pomaga w uruchamianiu aplikacji Java
- Pojęcia w języku C #: konstruktor, niszczyciel, klasa statyczna, struktura i wyliczenie
- Modyfikatory dostępu w Javie - samouczek z przykładami
- Samouczek dotyczący refleksji w języku Java z przykładami
- Wprowadzenie do języka programowania Java - samouczek wideo