Java vnitřní třídy
Java vnitřní třídy
V Javě je také možné vnořovat třídy (třída ve třídě). Účelem vnořených tříd je seskupit třídy, které k sobě patří, díky čemuž je váš kód čitelnější a udržitelnější.
Chcete-li získat přístup k vnitřní třídě, vytvořte objekt vnější třídy a poté vytvořte objekt vnitřní třídy:
Příklad
class OuterClass {
int x = 10;
class InnerClass {
int y = 5;
}
}
public class Main {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
// Outputs 15 (5 + 10)
Soukromá vnitřní třída
Na rozdíl od "běžné" třídy může být vnitřní třída private
nebo protected
. Pokud nechcete, aby vnější objekty přistupovaly k vnitřní třídě, deklarujte třídu jako private
:
Příklad
class OuterClass {
int x = 10;
private class InnerClass {
int y = 5;
}
}
public class Main {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
Pokud se pokusíte o přístup k soukromé vnitřní třídě z vnější třídy, dojde k chybě:
Main.java:13: error: OuterClass.InnerClass has private access in OuterClass
OuterClass.InnerClass myInner = myOuter.new InnerClass();
^
Statická vnitřní třída
Vnitřní třída může být také static
, což znamená, že k ní můžete přistupovat bez vytvoření objektu vnější třídy:
Příklad
class OuterClass {
int x = 10;
static class InnerClass {
int y = 5;
}
}
public class Main {
public static void main(String[] args) {
OuterClass.InnerClass myInner = new OuterClass.InnerClass();
System.out.println(myInner.y);
}
}
// Outputs 5
Poznámka: Stejně jako static
atributy a metody static
nemá vnitřní třída přístup k členům vnější třídy.
Přístup k vnější třídě z vnitřní třídy
Jednou z výhod vnitřních tříd je, že mají přístup k atributům a metodám vnější třídy:
Příklad
class OuterClass {
int x = 10;
class InnerClass {
public int myInnerMethod() {
return x;
}
}
}
public class Main {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.myInnerMethod());
}
}
// Outputs 10