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řídu Person — 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

Příklad využívající třídu 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í