Metoda statyczna - definicja

1

Witajcie
Mam pewien problem myśleniowy i chciałbym go rozwiązać:

Fakt:
Metoda statyczna - to metoda która jest współdzielona przez wszystkie instancje danej Klasy

Nie rozumiem dlaczego tylko współdzielona jest przez wszystkie instancje danej klasy, przecież z dowolnego kawałka programu można się odwołać do metody statycznej poprzez NazwaKlasy.nazwaMetodyStatycznej() i jest współdzielona przez obiekt innej klasy.

Z góry dzięki za wytłumaczenie.

2

Statyczna metoda nie jest związana z obiektem (instancją) klasy. Klasa to jest tylko taki namespace. Metoda statyczna nie ma dostępu do pól w obiekcie. To w sumie sposób na programowanie typowo procedurlane w językach wymuszających używanie klas. Nie potrzebujesz obiektu, aby wywołać metodę statyczną: potrzebujesz nazwę klasy (czyli namespace).

0

NazwaKlasy.nazwaMetodyStatycznej() w takim razie jak to rozumieć, chodzi mi głownie o to słówko "współdzielona"?

W macierzystej klasie metody statycznej obiekty korzystają po prostu z niej tak : nazwaMetodyStatycznej() i tyle a w innej klasie trzeba tak NazwaKlasy.nazwaMetodyStatycznej() = wspoldziela tzn maja taki sam dostep do niej ?

0

No bo jak jesteś w tej samej klasie to masz domyślny namespace tej klasy. Gdy nie jesteś w tym obiekcie to musisz powiedzieć kompilatorowi, gdzie ma szukać procedury. Skąd ma to wiedzieć? Jak podajesz klasę (wykonujesz metodę na klasie) to jest różnica logiczna niż wykonanie metody na konkretnej instancji (obiekcie).

0

Sorry że mam problem z myśleniem ...

Prawda że metoda statyczna ma zasięg globalny ? - więc jest współdzielona przez różne obiekty - tzn taka sama jest dla kazdego typu innego niż macierzysta klasa ?

0
gacus007 napisał(a):

Sorry że mam problem z myśleniem ...

Prawda że metoda statyczna ma zasięg globalny ? - więc jest współdzielona przez różne obiekty - tzn taka sama jest dla kazdego typu innego niż macierzysta klasa ?

Metoda statyczna może się odwoływać do zmiennych statycznych i wtedy, każda instancja ma tą samą wartość w tym polu statycznym. To zmienna statyczna jest współdzielona.

0

"To zmienna statyczna jest współdzielona" - Przez wszystkie obiekty ? Czemu akurat przez obiekty danej klasy? skoro mozemy z niej skorzystac z innej klasy poprzez NazweKlasy.metoda()?

0

Metoda statyczna - metoda klasy
Metoda nie-statyczna - metoda obiektu

0

Cześć :)

Myślę że nie chodzi o "współdzielenie", ale widoczność -- metody instancji mają dostęp do prywatnych metod i pól statycznych, a statyczne metody do prywatnych metod i pól instancji.

0

@gacus007:
Jak tworzysz obiekt to jest alokowana jakaś ilość pamięci.
Jak nie ustawisz zmiennej statycznej to będzie ona patrzyła np na null, albo inną wartość domyślną(w zależności od typu), ale to też jest pod jakimś adresem. Po ustawieniu jej na przykład na 5. Każda kolejny obiekt będzie miał 5, dopóki tego się nie zmieni.
W przypadku zmiennych niestatycznych wartości pól różnych obiektów tej samej klasy, są niezależne.
Jeśli chodzi o metody statyczne, to zwykle chodzi o to, żeby nie tworzyć obiektów wtedy jeśli nie są one niezbędne, bo każdy obiekt oznacza, że trzeba rezerwować odpowiednio dużo pamięci.

Metoda statyczna, to metoda klasowa, którą nie wymaga tworzenia obiektu.

0

@sqlka:
Rozumiem ze metody jak i pola statyczne nie potrzebują obiektu do swojego działania.

Teraz mi tylko chodzi o to :
Mam Klasa A


class A{
 public static String poleA;

}

public static void main(String[] args){

A a1=new A();
A a2=new A();
A a3=new A();


}

Czy każda nowa instancja a1,a2... bedzie posiadala referencje do polaA?

0

Napisałam klasę.

public class Pies {
private static String napis = "Pies";

public static void main(String[] args) {
	// TODO Auto-generated method stub
	System.out.println(
			 "Chcę tylko wydrukować napis pies, a nie tworzyc obiekt. Oto napis: " + Pies.napis);
	
	 Pies p1 = new Pies();
	 Pies p2 = new Pies();
	 System.out.println("Żeby to wywołac musze storzyć psa1 " + p1.napis);
	 
	 System.out.println("Żeby to wywołać musze stworzyć psa2 " + p2.napis);
		 
}

}

A oto wydruk:

Chcę tylko wydrukować napis pies, a nie tworzyc obiekt. Oto napis: Pies
Żeby to wywołac musze storzyć psa1 Pies
Żeby to wywołać musze stworzyc psa2 Pies

Jak widzisz oba obiekty mają tą samą wartosc w polu statycznym.

0

p1,p2 w momencie tworzenia otrzymują ten stały adres(reserencje) napisu dzieki czemu możemy pozniej z nich sie odwolac do tego jedynego?

0

Dzięki Wielkie wszystkim za pomoc @sqlka @margor90!
Znalazłem szczegółowy opis tego co chciałem : http://cunghocit.org/java/J3c_OOPWrappingUp.html

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