public static void main(String[] args) {
Account petrsAccount = new Account();
petrsAccount.add(100.0);
}
Tomáš Pitner, Radek Ošlejšek, Marek Šabo, Jakub Čecháček
V Javě jsou proměnné realizovány jako místa v paměti nesoucí hodnotu nebo odkaz na objekt. Rozlišujeme tyto kategorie podle místa výskytu proměnné:
atributy (nebo též proměnné objektu, instanční proměnné)
statické proměnné (nebo též statické atributy nebo proměnné třídy)
lokální proměnné (místní proměnné, proměnné v metodě)
Ve příkladu s bankovními účty se v metodě main
objevily proměnné (účty),
které nebyly atributy objektů, ale pracovalo se s nimi pouze v metodě samotné.
Takové proměnné se označují podobně jako v jiných jazycích jako lokální.
Podobně jako atributy mají i tyto proměnné svůj datový typ - primitivní nebo objektový.
V případě primitivního pak proměnná nese přímo hodnotu (například číslo nebo boolean
).
V případě objektového nese odkaz na objekt.
V tomto ohledu se to tedy nijak neliší od atributů.
public static void main(String[] args) {
Account petrsAccount = new Account();
petrsAccount.add(100.0);
}
Liší se však okamžikem vytvoření: vytvoří se při každém zavolání metody (v případě objektové proměnné se samozřejmě vytvoří jen ten odkaz, nikoli celý objekt).
Proto jsou také označovány jako automatické.
Technicky jsou vytvořeny alokací místa na zásobníku, tedy podobným mechanismem, jako se ukládají návratové adresy při volání metod.
Úplně klasicky vypadá například deklarace lokální proměnné takto:
primitivní typy (čísla, boolean
…): int i = 2
, boolean isOK = true
objektové typy:
Person jan = new Person("Honza");
// compiles iff Employee is a subclass of Person
Person petr = new Employee("Petr");
Doposud jsme viděli, že na levé straně byl uveden deklarovaný typ proměnné.
V novějších verzích Javy (8+) lze využít tzn. odvození typu (type inference).
Z typu výrazu na pravé straně odvodíme typ proměnné na levé straně:
var petr = new Employee("Petr Servus");
// so this does not compile - Employee expected:
petr = new Person("Petr Svatý");
Kromě výše uvedených jednoduchých situací uvidíme později další.
U tzv. parametrizovaných typů, např. seznamů, lze odvodit typ prvku seznamu z jedné strany na druhou - i zleva doprava.
List<Person> listPeople = new ArrayList<>();
// or the type on the left is inferred to ArrayList<Person>
var listPeople = new ArrayList<Person>();
Lambda výrazy (konstrukcty funkcionálního paradigmatu) jsou také typované.
Funguje zde odvození typů - zde se odvodí, že v seznamu jsou osoby:
var listPeople = new ArrayList<Person>();
// type of the list item is Person
// inferred type of lambda is `(Person p) -> p.print()`:
listPeople.forEach(p -> p.print());