StaticCzęść NR.9Słowo kluczowe “static” jest używane do tworzenia pól i metod do których dostęp nie wymaga utworzenia instancji klasy.

Statyczne elementy wewnątrz klasy należą do samej klasy. Nie statyczne elementy są kojarzone z każdą kopią obiektu.

Oznacza to, że każde statyczne elementy nie mogą używać elementów powiązanych z instancją/obiektem danej klasy. Na poziomie statycznych elementów instancja klasy i jej elementy nie istnieją.

Z drugiej strony metody niestatyczne mogą korzystać z statycznych metod i pól.

public class Circle
{
    double r = 10; // pole z instancji klasy  instance field
    static double pi = 3.14F; // statyczna pole klasy static/class field

    // Instancja method - Niestatyczna metoda
    double getArea() { return newArea(r); }

    // Statyczna metoda klasy
    static double newArea(double a) { return pi * a * a; }
}

Aby uczynić daną metodę lub pole statycznością wystarczy dopisać słowo kluczowe “static”.

Tak jak pisałem wcześniej w metodach statycznych nie można wywołać niestatycznych metod.

image

Jak użyć statycznej metody poza jej wnętrzem klasy? Trzeba napisać nazwę klasy , a po kropce napisać nazwę pol/metody statycznej z której chcemy skorzystać.

double f = Circle.pi;
Circle c = new Circle();
double g = c.r;

Statyczne elementy muszą mieć też odpowiednie poziomy dostęp by było to możliwe.

public class Circle
{
    public static void Example() { }

    public double r = 10; // pole z instancji klasy  instance field
    public static double pi = 3.14F; // statyczna pole klasy static/class field

    // Instancja method - Niestatyczna metoda
    double getArea() { return newArea(r); }

    // Statyczna metoda klasy
    static double newArea(double a) { return pi * a * a;  }
}

Statyczne metody

Statyczne metody mają taką zaletę, że mogą być używane przez inne klasy bez tworzenia ich instancji. Pola powinny być deklarowane tylko jeśli jedna instancja zmiennej jest potrzebna dla wszystkich klas.

Metody powinny być deklarowane statyczne jeśli wykonują one prostą operację niezależną od instancji klasy i zmiennych wewnątrz instancji klasy.

Dobry przykładem w Javie statycznych metod i pól jest klasa Math.

double pi = Math.PI;

W C# istnieje podobna klasa, ale oczywiście jest ona w innej przestrzeni nazw.

static void Main()
{
    double pi = System.Math.PI;
}

Statyczne pola

Statyczne pola mają taką zaletę, że żyją cały czas w cyklu działania aplikacji. Mogę więc być one używane do zapisywania ile razy dana metoda została wykonana dla wszystkich instancji tej klasy.

Pole statyczne inicjalizuje tylko raz. Pole te się zainicjalizuje zanim klasa lub pole zostanie w ogóle użyte.

class AnotherCircle
{
    static void Example() { count++; }
    static int count = 0;
}

Statyczny blok inicjalizacji (Java) i Statyczny konstruktor

W Javie istnieje statyczne bloki inicjalizacji, które pozwalają napisać bardziej skomplikowaną logikę do uzupełniania pól statycznych. Jeśli więc kod uzupełniający pola statyczne jest dłuższe niż linijkę powinieneś zastosować ten statyczny blok inicjalizacji.

Bloków statycznej inicjalizacji może być wiele.

Oto przykład uzupełnienia statycznej tablicy.

static int[] array = new int[5];
static
{
    int i = 0;
    for(int element : array)
    element = i++;
}

W C# aby osiągnąć ten sam efekt wystarczy skorzystać z statystycznego konstruktora. Konstruktor może być tylko jeden.

class MyClass
{
    static int[] array = new int[5];
    static MyClass()
    {
        int i = 0;
        for (int i = 0; i < array.Length; i++)
        {
            array[i] = i;
        }
    }
}

Nie może on mieć modyfikatorów dostępu.

W Javie można też w podobny sposób inicjalizować pola niestatyczne. Po prostu napisz kod na poziomie klasy bez żadnych dodatkowych bloków.

int[] array = new int[5];
{
   int i = 0;
   for(int element : array) element = i++;
}