Herdando classes aninhadas - 1

"Olá, amigo!"

"Oi, Kim."

"Quero falar sobre como herdar classes aninhadas estáticas e não estáticas."

"Estou pronto."

"Realmente não há problemas com a herança de classes aninhadas estáticas. Elas são herdadas como classes regulares:"

Exemplo
public class Car
{
 public static class Door
 {

 }
}

public class LamborghiniDoor extends Car.Door
{
}

"Mas podemos fazer com que classes aninhadas estáticas herdem classes aninhadas estáticas em outras classes?"

"Por que não?"

Exemplo
public class Car
{
 public static class Door
 {

 }
}

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

"OK, entendi. Eles são herdados como classes regulares, certo?"

"Sim. Mas classes aninhadas não estáticas (conhecidas como classes internas) não são herdadas tão facilmente."

"Quando uma instância de uma classe interna é criada, uma referência à sua classe externa é armazenada e passada implicitamente para o construtor."

"Como resultado, quando você cria objetos de uma classe que herda uma classe interna, você deve passar explicitamente o objeto externo necessário."

"Isto é o que parece:"

Código
public class Car
{
 public class Door
 {

 }
}

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

"Você deve passar implicitamente um objeto Car para o construtor Door. Isso é feito usando uma construção especial: «car.super()»."

"A propósito, se você tentar criar o construtor LamborghiniDoor sem nenhum parâmetro, o programa simplesmente não compilará. Um pouco estranho, hein?"

"Sim, existem algumas nuances, mas não é ciência de foguetes."