Spotkaliśmy się już z obydwoma typami metod. Metodą statyczną jest np. „Main()”, natomiast
public void PrzypiszWartosc(string nowaWartosc)
{
napis = nowaWartosc;
}
to metoda instancyjna. Metoda „PrzypiszWartosc(string nowaWartosc)” może być wykonana w ramach istniejącego obiektu. Np.
obiekt.PrzypiszWartosc("Przypisany tekst");
Metody statyczne nie wymagają aby wcześniej tworzyć instancje klas zwierających definicje tych metod. Dlatego „Main()” jest statyczna, ponieważ dzięki temu środowisko uruchomieniowe nie musi tworzyć obiektu aby program mógł zacząć działać. Przyjrzyjmy się przykładowi.
class KlasaPomocnicza
{
public void Napisz()
{
System.Console.WriteLine("Metoda klasy KlasaPomocnicza");
}
}
class KlasaGlowna
{
static void Main()
{
KlasaPomocnicza.Napisz();
System.Console.ReadLine();
}
}
Ten program się nie skompiluje, ponieważ chcemy wywołać metodę niestatyczną bez stworzenia wcześniej obiektu klasy zawierającej definicję tej metody. Możemy ten błąd naprawić na dwa sposoby.
Pierwszy to stworzenie obiektu klasy „KlasaPomocnicza”.
class KlasaPomocnicza
{
public void Napisz()
{
System.Console.WriteLine("Metoda klasy KlasaPomocnicza");
}
}
class KlasaGlowna
{
static void Main()
{
KlasaPomocnicza obiekt = new KlasaPomocnicza();
obiekt.Napisz();
System.Console.ReadLine();
}
}
Drugi natomiast to zadeklarowanie metody „Napisz()” jako statycznej.
class KlasaPomocnicza
{
public static void Napisz()
{
System.Console.WriteLine("Metoda klasy KlasaPomocnicza");
}
}
class KlasaGlowna
{
static void Main()
{
KlasaPomocnicza.Napisz();
System.Console.ReadLine();
}
}
A oto wynik:
Zmienne statyczne
Oprócz metod także zmienne mogą być statyczne. Różnią się one standardowych zmiennych tym, że są wspólne dla wszystkich obiektów klasy, w której znajdują się deklaracje owych zmiennych.
Najpierw przyjrzyjmy się programowi nie zawierającemu klas ze zmiennymi statycznymi.
class KlasaPomocnicza
{
public string napis;
public void Napisz()
{
System.Console.WriteLine(napis);
}
}
class KlasaGlowna
{
static void Main()
{
KlasaPomocnicza obiekt1 = new KlasaPomocnicza();
KlasaPomocnicza obiekt2 = new KlasaPomocnicza();
obiekt1.napis = "Czerwony";
obiekt2.napis = "Zielony";
obiekt1.Napisz();
obiekt2.Napisz();
System.Console.ReadLine();
}
}
Tworzymy dwa obiekty klasy “KlasaPomocnicza”, następnie przypisujemy różne wartości zmiennym “napis” każdego z obiektów. Na koniec wypisujemy zawartość każdej ze zmiennych na ekran.
Wynik jest taki jakiego się spodziewamy.
Zmodyfikujmy nasz program tak aby wykorzystać zmienne statyczne.
class KlasaPomocnicza
{
public static string napis;
public void Napisz()
{
System.Console.WriteLine(napis);
}
}
class KlasaGlowna
{
static void Main()
{
KlasaPomocnicza obiekt1 = new KlasaPomocnicza();
KlasaPomocnicza obiekt2 = new KlasaPomocnicza();
KlasaPomocnicza.napis = "Czerwony";
KlasaPomocnicza.napis = "Zielony";
obiekt1.Napisz();
obiekt2.Napisz();
System.Console.ReadLine();
}
}
Tym razem wartości przypisujemy dla klasy a nie dla obiektów. Wynik tym razem jest inny: