– Szia Amigo!
– Szia, Ellie!
"Ma egy nagyon érdekes témánk van. Ma a beágyazott osztályokról fogok mesélni."
"Ha egy osztályt egy másik osztályon belül deklarálnak, akkor az egy beágyazott osztály. A nem statikus beágyazott osztályokat belső osztályoknak nevezzük."
"A belső osztály objektumai a külső osztály objektumaiba vannak beágyazva, és ezért hozzáférhetnek a külső osztály változóihoz."
public class Car
{
int height = 160;
ArrayList doors = new ArrayList();
public Car
{
doors.add(new Door());
doors.add(new Door());
doors.add(new Door());
doors.add(new Door());
}
class Door()
{
public int getDoorHeight()
{
return (int)(height * 0.80);
}
}
}
"Ne feledje, hogy az Ajtó osztály rendelkezik egy getDoorHeight metódussal. Az Autó objektum magassági változóját használja, és visszaadja az ajtó magasságát."
"A Door objektum nem létezhet egy Car objektumtól függetlenül. Végül is a Car objektum változóit használja. A fordító láthatatlanul hozzáad a konstruktorhoz és a Door osztályhoz egy hivatkozást a külső Car objektumra, így a belső Door osztály metódusai hozzáférhet a külső Car osztály változóihoz, és meghívhatja metódusait."
"Beágyazott objektumok. Számomra logikus. A diagramból ítélve az egész nagyon egyszerű."
– És ez így van. Néhány árnyalattól eltekintve.
"A belső ajtó osztály az Autó objektumra hivatkozik, ezért:"
1) Nem hozhat létre Ajtó objektumot a Car osztály statikus metódusán belül, mert a statikus metódusok nem tartalmaznak hivatkozást a Car objektumra, amely implicit módon átadásra kerül a Door konstruktornak.
Helyes | Helytelen |
---|---|
|
|
2) A Door osztály nem tartalmazhat statikus változókat vagy metódusokat.
Helyes | Helytelen |
---|---|
|
|
"És mi van, ha szükségem van egy olyan változóra, amelyet minden Door objektum megoszt?"
"Mindig egyszerűen deklarálhatja az Autó osztályban. Ezután megosztja az összes Autó objektumba ágyazott ajtóobjektum."
3) Megjegyzés: ha a belső osztály nyilvánosnak van deklarálva, akkor annak példányai a külső osztályon kívül is létrehozhatók, de először a külső osztály példányának kell léteznie:
Car car = new Car();
Car.Door door = car.new Door();
Car.Door door = new Car().newDoor();
4) És még egy megjegyzés, amit majdnem elfelejtettem.
"Mivel két beágyazott objektumunk van, a belső objektum metódusai két "this" nevű hivatkozáshoz férnek hozzá:"
public class Car
{
int width, height;
public class Door
{
int width, height;
public void setHeight(int height)
{
this.height = height;
}
public int getHeight()
{
if (height != 0)
return this.height;
else
return (int)(Car.this.height * 0.8);
}
}
"Szándékosan deklaráltam az osztályokban azonos nevű változókat."
"Ha hozzá szeretne férni egy változóhoz a külső osztályból, ha az el van rejtve, vagy a "this"-hez egy belső osztályon belül szeretne hozzáférni, egyszerűen írja be a "YourClassName.this" parancsot:"
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this
"Szóval, ha egy belső osztály metódusába írjuk a "this" kifejezést, akkor a "this" a belső osztályra vonatkozik?"
"Igen, pontosan."
– Mi a véleményed a belső osztályokról, Amigo?
"Nagyon érdekesek. Nem mondanám, hogy túl nehézek."
"Sok korlátozás van, de ezek egészen logikusnak tűnnek, miután elmagyarázta, honnan származnak ezek a korlátozások, és miért léteznek."
– Ráadásul két hónapja írok beágyazott osztályokat a feladatokba, de csak most jövök rá, mit is írtam valójában.
– Köszönöm a nagyszerű leckét, Ellie.
– Örülök, hogy tetszett, Amigo.
GO TO FULL VERSION