Modyfikator static

Modyfikator static możemy stosować dla :

  • zmiennych

  • metod

  • bloków kodu

  • klas zagnieżdżonych

 

Modyfikator static dla pól klasy

Jeśli pole w klasie poprzedzisz modyfikatorem static, stanie się ono wspólne dla wszystkich obiektów tej klasy. Wartość ustawiona w takim polu alokuje obszar pamięci tylko raz, a nie dla każdego obiektu tej klasy.

Na potrzeby przykładu przygotowałem prostą klasę posiadającą dwa pola, z czego jedno jest statyczne:

 

public class PoleStatyczne {

String niestatyczne;

static String statyczne;

@Override

public String toString() {

return "PoleStatyczne{" + "niestatyczne=" + niestatyczne +" statyczne="+statyczne +"}";

}

}

W innym miejscu programu tworzę w pętli 10 obiektów tej klasy i dodaję do listy. Dla każdego obiektu dodawanego do listy ustawiam wartość tylko pola niestatycznego. Następnie poprzez wywołanie "PoleStatyczne.statyczne=...." przypisuję wartość do pola statycznego. Jak widać nie odwołuję się do pola w każdym obiekcie osobno, ale w klasie:

 

ArrayList<PoleStatyczne> lista = new ArrayList<>();

for (int x = 1; x <= 10; x++) {

PoleStatyczne ps = new PoleStatyczne();

ps.niestatyczne="wartość niestatyczna "+x;

lista.add(ps);

}

PoleStatyczne.statyczne="Stała wartość dla wszystkich obiektów...";

for(PoleStatyczne p: lista){

System.out.println(p);

}

W dalszej kolejności iteruję po uzupełnionej liście i wyświetlam jej zawartość. Wynik działania programu:

Zawartość pola statycznego jest taka sama dla wszystkich obiektów.

 

Modyfikator static dla metod

Dodanie modyfikatora static do metody sprawi że bedzie można wywołać daną metodę bez tworzenia obiektu klasy w której się znajduje. Metoda statyczna może "dotykać" tylko statycznych pól i wywoływać tylko statyczne metody w ramach klasy. Odwołania "this" i "super" nie mogą być wykorzystywane w ramach metody statycznej. Przykładowo mamy klasę posiadającą dwie metody, z czego jedna jest statyczna a druga nie:

 

public class MetodaStatyczna {

public static void statycznaNapiszCos(){

System.out.println("Coś ze statycznej");

}

 

public void napiszCos(){

System.out.println("Coś ze zwykłej");

}

}

Aby wywołac metodę niestatyczną, musimy stworzyć obiekt klasy. W przypadku metody statycznej nie ma takiej konieczności:

 

MetodaStatyczna ms = new MetodaStatyczna();

ms.napiszCos();

MetodaStatyczna.statycznaNapiszCos();

 

Statyczny blok inicjalizacyjny

Konstrukcja taka jak poniższa, to statyczny blok inicjalizacyjny. Jest wykonywana jednokrotnie przy pierwszym odwołaniu się do klasy :

 

public class BlokStatyczny {

static{

System.out.println("Hello from here...");

}

}

Możesz się o tym przekonać wywołując poniższy kod:

 

BlokStatyczny bs = new BlokStatyczny();

BlokStatyczny bs2 = new BlokStatyczny();

BlokStatyczny bs3 = new BlokStatyczny();

 

Komunikat z metody statycznej zobaczysz tylko raz:

Takie bloki statyczne mogą służyć np do inicjalizacji pól statycznych.

 

Kod do powyższych przykładów:

jsystems.pl/static/download/blog/java/Static.zip

Ten artykuł jest elementem poniższych kursów: