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.
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++;
}