Kiedy ma sens odwołanie się do składowej poprzez static?

0

Hej

Rozumiem to zdanie: "Słowo kluczowe static umożliwia odwołanie się do składowej jakiejś klasy (składowej: zmiennej lub metody) bez konieczności tworzenia obiektu tej klasy."

Kiedy ma sens odwołanie się do składowej poprzez static a kiedy lepiej jest się do niej odwołać poprzez tworzenie obiektu danej klasy?

EDIT: "Modyfikator static sprawia, że obiekt w danej funkcji jest umieszczany w tej samej pamięci, co zmienna globalna i nie jest usuwany wraz z zakończeniem funkcji." Nie wiem czy tyczy się to też javy, znalazłem to pod tagami C/C++. To jest moja odpowiedź? Jeżeli tak to jakie ma to praktyczne zastosowanie?

0

Chodzi o to że pola lub metody static są należą do klasy a nie do obiektu, więc do korzystania z nich nie potrzebne są obiekty. Czyli każdy obiekt posiada własną kopię zwykłego pola ale pole ze specyfikatorem static jest wspólne dla wszystkich obiektów.

Przykład użycia:

public class Klasa {
   private static next_id;
   private id_obiektu;

   public Klasa () {
      id_obiektu = next_id;
      next_id++;
   }

}

każdy obiekt ma id, ale w klasie istnieje wspólne dla wszystkich pole które przechowuje aktualne id

dodanie znacznika <code class="java"> - @furious programming

0

Czyli obiekt klasy działa na własnej kopi pola i zmiany, które na tym polu dokonamy będą zachodziły dla tej kopi bez naruszania oryginału. Przy opcji statycznej wszelkie zmiany jakie dokonamy zachodzą na oryginale bo nie tworzymy kopi tego pola?

0
rubesom napisał(a):

Kiedy ma sens odwołanie się do składowej poprzez static

static ma sens np. dla utilsów czy stałych. robisz to wtedy np. tak:
public static final double PI = 3.14159265358979323846;

0

@rubesom nie. Obiekt ma po prostu SWOJE pola, nie żadne kopie. Pola statyczne są polami klasy wiec niejako są "wspólne" dla wszystkich obiektów klasy. zmienne static dla funkcji to zupełnie co innego i jedno z drugim nie ma związku.

0

Np. robię metodę:

 	public static int suma(int a, int b)
	{
		int dodawanie = a+b;
		return dodawanie;
	}

I wyświetlę ją zwyczjanie:

System.out.println(suma(1, 2));

To co determinuje wybór czy robić przez static czy robić poprzez obiekt?

0

W takim przypadku to jest metoda utilsowa, więc generalnie może być statyczna / a nawet jeśli nie to obiekt i tak będzie singletonem. Obiekty zwykle przechowują pewien stan i metody zwracają wyniki powiązane z tym stanem obiektu. Wyobraź sobie że tworzysz klasę "Odcinek" która ma współrzędne odcinka jako pola i metodę "długość()" która zwraca długość odcinka. Albo metodę "przesuńOWektor()". Widzisz chyba że trudno byłoby tu zrobić bez używania nie-statycznych pól klasy, jeśli w programie masz wiele odcinków na raz.

0

Czyli chodzi o to, że przy tworzeniu obiektu klasy mogę zrobić np. kilka konstruktorów poprzez przeciążanie metody co daje mi większe pole do działania? A przy statycznej metodzie nie mam takich możliwości?

0

Nie, zupełnie nie o to chodzi. Chodzi o to że do metody utilsowej musisz przezkazać WSZYSTKIE dane na których ma pracować. To znaczy że gdzieś na boku musisz te dane mieć i jej przesłać. OOP ma za zadanie łączyć dane z operacjami, tzn jeśli istnieje jakaś operacja dla zestawu danych to dobrze te dane z nią powiązać. Skoro na przykład liczenie długości odcinka ma sens tylko dla Odcinka, to sensownie jest połączyć "dane o odcinku" z "operacjami na odcinku".

0

To po co są metody utilsowe? Nie lepiej zawsze pracować na obiektach.
Chodzi mi o to, że nie za bardzo rozumiem jaka jest praktyczna różnica między tymi dwoma typami metoda i co je determinuje.
W utilsowej nie mam czegoś takiego jak konstruktor i muszę podać jej wszystkie dane. Ale tak samo podaje wszystkie dane wykorzystując obiekt - chodzi mi o konstruktory.

0

Przykładem klasy utilowej jest Math z pakietu java.lang. Ma prywatny konstruktor, wszystkie metody oraz pola statyczne a do tego jest final. Nie ma sensu tworzyć obiektu skoro każde wywołanie metody np. sqrt() da taki sam efekt niezależnie od obiektu.

2

@rubesom bo czasem po prostu miałbyś setki klas z jedną operacją co nie miałoby wielkiego sensu. Albo z drugiej strony miałbyś tysiące metod w jednej biednej klasie (np. wszystkie możliwe operacje matematyczne w klasie Integer albo Double). Trzeba się tu kierować logiką :)

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