Proměnné a metody třídy
-
Dosud jsme zmiňovali atributy (proměnné) a metody objektu.
-
Lze deklarovat také metody a proměnné patřící celé třídě, tj. všem objektům této třídy
-
taková proměnná nebo metoda tedy existuje pro jednu třídu jen jednou!
-
Takové metody a proměnné nazýváme statické (anglicky nejčastěji class variables a static methods) a označujeme v deklaraci modifikátorem
static
.
Příklad
-
Představme si, že si budeme pamatovat, kolik lidí se nám během chodu programu vytvořilo a vypisovat tento počet.
-
Budeme tedy potřebovat do třídy
Person
doplnit:-
jednu proměnnou
peopleCount
společnou pro celou tříduPerson
— každý člověk ji při svém vzniku zvýší o jedna. -
jednu metodu
howManyPeople
, která vrátí počet dosud vytvořených lidí.
-
Příklad peopleCount
public class Person { private String name; private int age; // v tomto ILUSTRAČNÍM příkladu výjimečně "public" public static int peopleCount = 0; public Person(String name, int age) { this.name = name; this.age = age; peopleCount++; } public static int howManyPeople() { return peopleCount; } }
Note
|
Všimněte si v obou případech modifikátoru/klíčového slova static . |
Odkud co lze použít?
-
Časté začátečnické chyby vznikají při pokusu přistoupit k běžné, tj. nestatické metodě nebo atributu z metody statické.
-
To pochopitelně není možné, protože ve statické metodě nemáme jeden konkrétní objekt, na němž jsme ji volali a na němž bychom použili požadovanou metodu nebo atribut.
-
Java ohlásí při překladu chybu:
XY cannot be referenced from a static context
-
Vysvětleno také v Why non-static variable cannot be referenced from a static context?, ukázka:
Příklad co nelze použít
public class StaticTest { private int count = 0; public static void main(String args[]) { count++; //compiler error: non-static variable count cannot be referenced from a static context } }
Jak se odkazovat na statickou metodu a proměnnou?
-
Lze stejně jako na nestatické, tzn. identifikátorem proměnné objektu
-
Lepší je však identifikátorem (názvem) celé třídy
Person
public class People { public static void main(String[] args) { // tady by něco ještě bylo ... Person honza = new Person("Jan Horák"); // přes objekt honza možné, ale System.out.println(honza.peopleCount); // přes třídu Person správnější System.out.println(Person.peopleCount); } }
Note
|
Zcela obdobně i při volání statických metod |
Více informací
-
Opět tutoriál Java @Oracle: Class variables