je uvozené klíčovým slovem
static
, pak se jedná o statickou vnořenou tříduobjekt takové třídy potřebuje pro své vytvoření samotnou obklopující třídu, jednotlivý objekt není třeba
Nested nested = new Outer.Nested()
Tomáš Pitner, Radek Ošlejšek pitner@muni.cz
definované uvnitř jiné třídy jako její prvek - podobně jako metody nebo atributy
definované uvnitř metody podobně jako lokální proměnná
jako vnořené, ale potřebují ke své instanciaci objekt vnější třídy, v níž jsou definovány
Inner inner = outer.new Inner()
vnitřní, ovšem nepojmenované, pojmenuje si je překladač sám stylem Person$1
Definovaná uvnitř jiné třídy jako její prvek - podobně jako metody nebo atributy.
je uvozené klíčovým slovem static
, pak se jedná o statickou vnořenou třídu
objekt takové třídy potřebuje pro své vytvoření samotnou obklopující třídu, jednotlivý objekt není třeba
Nested nested = new Outer.Nested()
chybí-li static
, jedná se o nestatickou vnořenou třídu
objekt takové třídy potřebuje pro své vytvoření objekt své nadřazené, obklopující třídy
Inner inner = outer.new Inner()
Použití statické vnořené třídy je dobrá praktika — zapouzdření.
Lze ji mít jako private
, pak není vidět zvenčí.
Přesto je použitelná v rámci atributů metod obklopující vnější třídy.
I opačně — statická vnořená třída může používat i privátní metody a atributy své vnější třídy.
public class Enclosing {
private static int x = 1;
public static class StaticNested {
private void run() { ...}
}
public void test() {
// StaticNested is of course visibile here -
// even if it were private
StaticNested nested = new StaticNested();
nested.run();
}
}
class Another {
public void test() {
// works since both Enclosing & StaticNested are visible here
Enclosing.StaticNested nested = new Enclosing.StaticNested();
nested.run();
}
}
blíže viz Java Nested Classes |
Map.Entry
public class MapDemo {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
for(Map.Entry<String, String> entry: map.entries()) {
// do something for each (key, value) pair:
// entry.getKey(), entry.getValue()
// or entry.setValue(...)
}
}
}
blíže viz Interface Map.Entry<K,V> |
Vnitřní = nestatická vnořená třída
Objekt takové třídy potřebuje ke své instanciaci objekt své vnější třídy.
Inner inner = outer.new Inner()
public class KarelGame {
// will be visible from Karel, too
private static enum Heading { LEFT, RIGHT }
private int[] field = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
// this Karel is bound to a KarelGame
private Karel karel = new Karel();
// inner class
public class Karel {
private int position = 0;
public void put() {
// the field in KarelGame is accessible from Karel's method
// even though it is private
if(field[position] < MAX_ITEMS) field[position]++;
vnitřní, ovšem nepojmenované
na jednom místě se definuje a zároveň i jednou použije (instanciuje)
většinou jako implementace rozhraní nebo abstraktní třídy