Do czego służą klasy statyczne?

0

Witam.

Możecie mi wytłumaczyć do czego służą klasy statyczne ?

Czym np różni się coś takiego:

 public static class StaticFoo
        {
            public static int x = 0;
        }

od

public class Foo
        {
            public static int x = 0;
        } 

Z tego co zrozumiałem to

  1. Metoda statyczna może zawierać wyłącznie pola/metody statyczne.
  2. Do statycznych metod/pól obydwóch klas mam dostęp bez tworzenia obiektu klasy (co za tym idzie w klasie statycznej mam dostęp do "wszystkiego" - nawiązując do pkt 1).
  3. Mogę utworzyć obiekt klasy "niestatycznej" (mimo że zawiera pola/metody statyczne), natomiast obiektu klasy statycznej nie utworzę.

Jakie jeszcze są główne i kluczowe różnice i zastosowania klasy statycznej ?

3

static na klasie to tylko restrykcja uniemożliwiające stworzenie jej instancji

0
gdsfgsfd napisał(a):

Możecie mi wytłumaczyć do czego służą klasy statyczne ?

Nie jestem pewien ale chyba modyfikator static używa się w praktyce do pól klasy bądź metod a nie całej klasy...
Wracając do tematu - wyobraź sobie, że piszesz duży projekt w którym potrzebujesz sporo dodatkowych funkcji, wykorzystywanych na bieżąco (np. funkcje matematyczne - sinus, cosinus, etc). Gdybyś chciał tego użyć w dowolnym miejscu musiałbyś najpierw stworzyć obiekt tej klasy (np. math = new MathFunctions()) a potem wywołać metodę na obiekcie (np. sinus = math->getSinus(value)). Mając klasę statyczną, nie musisz tworzyć nowego obiektu aby użyć danej metody. Wystarczy ją po prostu wywołać (np. w PHP mogłoby to wyglądać tak: MathFunctions::getSinus(value)). Stąd metoda statyczna nie odwołuje sie do swoich własnych pól (czyli $this'a) bo nie trzeba dla niej tworzyć obiektu klasy.
http://php.net/manual/en/language.oop5.static.php.

0

@hapertown rozumiem co masz na myśli jednak do tego celu wystarczą metody statyczne (wewnątrz klasy nie koniecznie statycznej) - już wtedy mam do nich dostęp bez tworzenia obiektu klasy.
Właśnie dlatego powstało moje pytanie po do dodatkowo oznaczać klasę jako statyczną, ale wychodzi na to, że tak jak napisał gdsfgsfd jest to jedynie "zabezpieczenie" przed tworzeniem instancji tej klasy (choć co by zaszkodziło gdyby ktoś to jednak zrobił ... ? ).

2

Wygląda na to, że jest to zabieg polegający głównie na pewnej formie wygody dla programistów aby nie musieli tworzyć instancji obiektu dla elementów które są stałe i nie wymagają np. konstruktora w którym należałoby podać pewne wartości rzutujące na zachowanie całej klasy i ich metod.
http://stackoverflow.com/a/5527138

0

@hipekk
Przeczytaj odpowiedź @gdsfgsfd

Albo:

A static class is basically the same as a non-static class, but there is one difference: a static class cannot be instantiated.

https://msdn.microsoft.com/pl-pl/library/79b3xss3.aspx

Albo:
http://ideone.com/q1J2jV

1

warto jeszcze dodać że nie można z takiej klasy dziedziczyć - inaczej "static" na klasie by się wiele nie różnił od "abstract"

Niemożność dziedziczenia klas statycznych to jedna z głównych przyczyn unikania ich stosowania

0
uuuf napisał(a):

warto jeszcze dodać że nie można z takiej klasy dziedziczyć - inaczej "static" na klasie by się wiele nie różnił od "abstract"

Różniłby się znacznie, bo klasie statycznej nie możesz operować na stanie konkretnej instancji, z czym nie ma problemu w klasie abstrakcyjnej.
Jeśli chcemy zabronić dziedziczenia, to oznaczamy klasę jako sealed, a nie static.

Niemożność dziedziczenia klas statycznych to jedna z głównych przyczyn unikania ich stosowania

Klas statycznych się nie unika lecz używa wówczas, gdy potrzebujemy zbioru metod nie operujących na tych samych danych ani obiektach, a więc bezstanowych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1