[ samilen @ 11.03.2005. 23:52 ] @
Da li se static atribut u nekoj klasi, ili apstraktnoj klasi, nasleđuju izvedene klase, ili postoji samo jedna vrednost za sve instance svih podklasa.
[ StMilan @ 12.03.2005. 01:54 ] @
Mislim da ti je najlakše da za 5 minuta napišeš test kod i da probaš.

Statička polja i metodi su vezani za klasu u kojoj su deklarisani i nemaju veze ni sa jednom instancom. Ne možeš da imaš polimorfizam sa statičkim metodama npr.

Tako da se zapravo (bar ja tako gledam) statička polja i metodi zapravo ne nasleđuju, mada tako može da se čini zbog vidljivosti u podklasama. Odgovor na tvoje pitanje bi bio da postoji samo jedna vrednost. (naravno, prvo sam napisao kod i probao, pa onda filozofirao :))
[ samilen @ 12.03.2005. 21:52 ] @
>
Citat:
Mislim da ti je najlakše da za 5 minuta napišeš test kod i da
probaš.

Istina je da me je mrzelo da kucam kod, ali priznajte da je tema zanimljiva
i zaslužuje da bude ovde bar dokumentaciono, kako bi početnici mogli nešto
da shvate bez da probaju. Pošto sam još uvek lenj, a želeo bih odgovore,
pitanje nastavlja svoj život, ali se sada odnosi samo na apstraktne klase.

Da li to isto važi i za apstraktne klase i interfejse?

:)Pitanje počinje da evoluira u mojoj glavi i poprima oblike užasnih pitanja
svih pitanja: ZAŠTO JE TO TAKO?
DA LI JE TO OPRAVDANO?
[ Dragi Tata @ 12.03.2005. 22:55 ] @
Static promenljive su samo drugo ime za globalne promenljive.
[ logotet @ 13.03.2005. 13:39 ] @
Citat:
Dragi Tata: Static promenljive su samo drugo ime za globalne promenljive.

Ne bih se složio.
Ako imaš
Code:
private static int broj;

to se teško može nazvati globalom promenljivom.
Static članovi (polja ili metode) su zajednički za sve INSTANCE jedne klase. I to po mom mišlenju dovoljno sve objašnjava.
To što se programerska poteba da napravi nešto globalno realizuje preko static članova, ne znači da je static drugo ime za globalnu promenljivu.
[ Dragi Tata @ 13.03.2005. 14:25 ] @
Ako je staviš da bude private, onda je to grubo rečeno ekvivalentno globalnoj u C-u sa internim linkovanjem. Pristup je ograničen na jedan deo koda, ali taj deo koda i dalje koristi promenljivu kao da je globalna.
[ samilen @ 13.03.2005. 15:03 ] @
>

Sve to nije sporno, samo bi bilo interesantnije da mogu da se nasleuđju, što
bi u nekim slučajevima olakšalo programiranje.
Recimo da hoću da svaka podklasa ima static promenljivu/metodu istog naziva,
ali da svaka instanca ima različitu vrednost. Ok, to uvek može i drugačije,
ali recimo da je u konkretnom slučaju važno da promenljiva bude statična
(npr. nasleđivanje specifičnog singletona koji ima protected static Object
instance=null; promenljivu)
[ logotet @ 13.03.2005. 18:59 ] @
Citat:
samilen: >
...Recimo da hoću da svaka podklasa ima static promenljivu/metodu istog naziva,
ali da svaka instanca ima različitu vrednost.

Ovde nešto ne štima. Ako hoćeš da svaka instanca ima različitu vrednost, onda to nije static, već "normalna" promenljiva ili metoda.
A, da se vratimo na prvobitno pitanje.
Ako u klasi A imaš neki static član, on je zajednički za sve instance te klase i njenih potklasa, naravno pod uslovom da potklasa B nema član istog imena, a takođe static.
A to je i vrlo logično.
Static čan se "instancira" kreiranjem prve instance klase. Prilikom instanciranja objekta potklase, konstruktor natklase se takođe izvršava i to dovodi do "stvaranja" static člana. To važi za polja. Za metode je nevažno, jer su static metode zapravo funkcije koje pozivaš sa Klasa.metoda() i njih možeš prebaciti i u neku desetu klasu, ništa se ne menja. Static metode se programiraju u oviru neke klase radi preglednije i bolje organizacije koda, a ne zato što im je tu prirodno mesto, dok se "obične" metode programiraju u okviru neke klase jer definišu ponašanje objekta te klase.
[ samilen @ 14.03.2005. 02:20 ] @
Izvinjavam se sto sam upotrebio rec instanca gde joj nije mesto, kucao sam na brzinu ubijajuci viruse drugom rukom :). Mislio sam, zapravo, na podklasu.
Citat:
Static čan se "instancira" kreiranjem prve instance klase.
Cini mi se da i ovde nesto ne stima. Zapravo za poziv static clana nije potrebno nikakvo instanciranje klase(ako je public). Mora da je pominjanje singletona izazvalo zbrku.
[ logotet @ 14.03.2005. 17:07 ] @
U poglavlju 12 specifikacije jezika je pojašnjen redosled prilikom inicijalizacije klase. I , iako različiti ClassLoaderi i JVM mogu imati sitne specifičnosti, važi generalno pravilo da se inicijalizacija obavlja prilikom prvog poziva konstruktora, ili prilikom prvog "poziva" static metode ili dodeljivanja vrednosti static članu.
Tom prilikom se vrši i inicijalizacija natklasa, ako već nisu inicijalizovane. Ovde se koristi termin inicijalizacija, da bi se razlikovalo od instanciranja. Zato sam u prethodnom postu stavio instanciranje pod znake navoda, ali očigledno nije bilo jasno.