znaczenie słowa kluczowego static - "nieruchomy"

pastefqa

Tworząc instancję klasy (obiekt), każda niestatyczna (ruchoma) metoda, właściwość, zdarzenie czy pole danej klasy mają swoją odrębną alokację w pamięci.
Wzorując się na świetnym (moim zdaniem) stwierdzeniu, że: "...grupując dane i związane z nimi funkcje w definicji klas, można modelować oprogramowanie na wzór bytów ze świata rzeczywistego." od razu przykład z "życia wzięty":

Budka z piwem - osiedlowy kwadrat do wychylenia kilku pianek. Do budki przyłażą codziennie: Marian, Stefan i Zenon. Pani Maryla - "operator" (załóżmy, że jest właścicielem budy) zna każdego z osobna i wie, że żaden z jej klientów nie zna się wzajemnie, a każdy z nich ma ograniczony budżet do wydania na "posiedzeniu", czyli każdy może wychylić określoną ilość:

class budkaMaryli
    {
        public string budImie;
        public int budLimit;
    }

budkaMaryli panMarian = new budkaMaryli();
budkaMaryli panStefan = new budkaMaryli();
budkaMaryli panZenon = new budkaMaryli();

O konstruktorach (i nawet destruktorach) klas (domyślnych i innych) można (a nawet trzeba...) poczytać tutaj
Sytuacja wygląda tak: mamy trzech delikwentów w budce u Maryli. Każdy z nich może przybrać swoje (lub nie) imię i limit jaki wychyli, np. Marian:

panMarian.budImie = "Marian";
panMarian.budLimit = 3;

Stefan ma możliwości większe: 5, a Zenon mniejsze: 1.
Czyli z poziomu obiektu (instancji danej klasy) możemy przypisać każdemu z nich wartość limitu.

Jednak, jak to w życiu bywa, pani Maryla się wpieniła bardzo mocno (nie płacili) i zapragnęła ustalić dla wszystkich w budce jednakowy limit - czyli to nie klienci budki ustalają wg swojego widzi mi się (jak to bywa po kilku pianach) limity jakie mogą osiągnąć, ale tylko właścicielka budy (czyli klasa) pani Maryla:

class budkaMaryli
    {
        public string budImie;
        public static int budLimit; //słowo kluczowe "static"
    }

budkaMaryli panMarian = new budkaMaryli();
panMarian.budImie = "Marian";
panMarian.budLimit = 894; //kompilator się zbuntuje!
//tutaj już pani Maryla (klasa) rządzi!

Od teraz tylko "klasyczna" pani Maryla może ustalić limit (i to dla każdego pod budką). A to, że komuś spod budki wydaje się inaczej, nikogo nie obchodzi - kompilator tego nie przełknie.
Tylko klasa (budkaMaryli) może ustawić limit:

budkaMaryli.budLimit = 2; //koniec i kropka!

Czyli niezależnie od imienia, którym dany delikwent się przedstawia pod budką i jego teoretycznych możliwości, limit będzie wynosił dokładnie 2 na głowę ponieważ klasa (budkaMaryli), z której wywodzi się ten cwaniak ustala reguły...

Reasumując:
Składowa statyczna jest alokowana dokładnie raz dla wszystkich instancji (obiektów) danej klasy - niezależnie od ilości samych obiektów.
Wszystkie obiekty klasy (w której występuje statyczny argument) operują na tej samej zmiennej statycznej tylko z poziomu klasy.
Jeżeli z poziomu klasy składowa statyczna zostanie zmieniona - każdy obiekt (instancja tej klasy) "widzi" zmienioną składową.

Jest to tylko bardzo luźny wstęp do statycznych części klas. Mam nadzieję, że pomocny.

2 komentarzy

corwin
a po co tak robić ? Masz już z góry narzucony limit więc nie potrzebujesz pytać Mariana :P Ja też nowy tutaj... I licze na ciąg dalszy historii Panów spod Budki :D

Co mnie zaskoczyło ale w artykule nie znalazłem to po zrobieniu
public static int budLimit;
nie można zrobić np tak:
System. Console.WriteLine(panMarian + " moze wypic " + panMarian.budLimit)
więc nawet nie to, że ona ustawia limit tylko po prostu nie istnieją inne limity :)

Pozdrawiam i witam wszystkich bo ja tu pierwszy raz :)