Moștenirea claselor imbricate - 1

"Bună, Amigo!"

— Bună, Kim.

„Vreau să vă spun despre moștenirea claselor imbricate statice și non-statice.”

"Sunt gata."

„Nu există într-adevăr probleme cu moștenirea claselor imbricate statice. Acestea sunt moștenite la fel ca și clasele obișnuite:”

Exemplu
public class Car
{
 public static class Door
 {

 }
}

public class LamborghiniDoor extends Car.Door
{
}

„Dar putem face ca clasele imbricate statice să moștenească clase imbricate statice în alte clase?”

"De ce nu?"

Exemplu
public class Car
{
 public static class Door
 {

 }
}

public class Lamborghini extends Car
{
 public static class LamborghiniDoor extends Car.Door
 {
 }
}

"OK, am înțeles. Sunt moștenite la fel ca și cursurile obișnuite, nu?"

"Da. Dar clasele imbricate non-statice (cunoscute ca clase interioare) nu sunt moștenite la fel de ușor."

„Când este creată o instanță a unei clase interioare, o referință la clasa sa exterioară este stocată și implicit transmisă constructorului.”

„Ca urmare, atunci când creați obiecte dintr-o clasă care moștenește o clasă interioară, trebuie să transmiteți obiectul exterior necesar în mod explicit.”

„Așa arată:”

Cod
public class Car
{
 public class Door
 {

 }
}

public class LamborghiniDoor extends Car.Door
{
 LamborghiniDoor(Car car)
 {
  car.super();
 }
}

"Trebuie să treceți implicit un obiect Car către constructorul Door. Acest lucru se face folosind un construct special: «car.super()»."

"Apropo, dacă încerci să creezi constructorul LamborghiniDoor fără niciun parametru, programul pur și simplu nu se va compila. Puțin ciudat, nu?"

„Da, există câteva nuanțe, dar nu este știință rachetă”.