/ / Java vnorené triedy - pod kapotou? - java

Java vnorené triedy - pod kapotou? - java

Mám niekoľko otázok týkajúcich sa vnorených tried v prostredí Java.

  • Ako sa vnorené triedy zobrazujú „pod kapotou“, pokiaľ ide o pridelenie pamäte?

  • Nemôžete deklarovať statickú premennú v rámci avnorená trieda (myslím si, že presná chyba bola, že statické atribúty je možné deklarovať iba v triede najvyššej úrovne). Prečo je to tak a aké ďalšie obmedzenia existujú pre vnorené triedy?

Ak je to možné, povedzte, prosím, či je vaša odpoveď špecifická pre jazyk Java, alebo či aj C ++ dodržiava rovnaké pravidlá?

odpovede:

1 pre odpoveď č. 1

Vnútorné triedy sú úplne rovnaké ako bežné triedytriedy, čo sa týka pamäte a kompilácie. (Možno existuje nejaký rozdiel v spôsobe, akým sú spravované v pamäti, ale priemerný vývojár Java to nevidí.) Keď kompilujete triedu, ktorá má vnútornú triedu, uvidíte zostavený súbor .class. ako OuterClass$InnerClass.class. Pokiaľ teda viem, JVM s nimi zaobchádza rovnako.

Pokiaľ ide o statické premenné, nie som si istý, o čo ide. Napríklad toto beží pre mňa:

public class Tester {
public static void main(String[] args) {
System.out.println(InnerTester.MY_STRING);
}

public class InnerTester {
public static final String MY_STRING = "MY_STRING";
}
}

UPRAVIŤ

Ako zdôraznil Jeffery, NEkompiluje sa:

public class Tester {
public static void main(String[] args) {
System.out.println(InnerTester.MY_STRING);
}

public class InnerTester {
public static String MY_STRING = "MY_STRING";
}
}

Rozdiel je v tom, že prvú statickú premennú som mal uvedenú ako konečnú.

Po chvíli premýšľania o tom súhlasím s @Eugene. Umožňujú statické polia na vnútorných triedach final pretože potom nie je problém s inicializáciou. Hodnota nemôžu zmeniť, iba ho inicializujete na svoju hodnotu. Ak však statické pole je nie final, potom požadujete inštancie vonkajšej triedy, ktorá sa má vytvoriť na inicializáciu poľa, a statické členy nemožno viazať na konkrétne inštancie.

našiel som toto diskusia aj o tom.


1 pre odpoveď č. 2

V podstate vnorená trieda je iba trieda s poľom odkazujúcim na uzatvárajúcu inštanciu.

Pokiaľ to nie je statická vnorená trieda (vo vnútri ktorej môžete deklarovať statické polia / metódy). V tomto prípade je to iba trieda s iným prvkom cesty v názve (balíček + obklopujúci názov triedy).

Inými slovami. Nestatická vnorená trieda (vnútorná trieda) - nemôže existovať bez ohraničenia inštancie (napr. Stránka v knihe). A vytvoríte inštanciu nasledovne:

 Book book = ... // a book instance;
Book.Page page = book.new Page(); // requires an enclosing instance

Ale statická vnorená trieda - je úplne nezávislá, je to len otázka priestoru mien. Môžete ju vytvoriť ako:

 Outer.NestedStatic instance = new Outer.NestedStatic(); // just name-space

Viac informácií tu: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html


0 pre odpoveď č. 3

Vnorená trieda je jednoducho definícia typu v inej triede. Java nezaujíma, v akom rozsahu je definovaný nový typ, a nemusíte túto vnútornú triedu nijako zvlášť „vybavovať“.

Nemalo by zmysel mať nestatickú vnútornú triedu so statickými poľami, pretože každý odkaz na nestatickú vnútornú triedu je nevyhnutne premennou inštancie. Iba ak je vytvorená vnútorná trieda static bolo by to vôbec možné staticky priradiť - v tomto prípade je statická vnútorná trieda samostatná trieda, pričom priložený názov triedy slúži ako ďalšia úroveň menného priestoru.