Kế thừa các lớp lồng nhau - 1

"Chào, Amigo!"

"Chào Kim."

"Tôi muốn nói với bạn về kế thừa các lớp lồng nhau tĩnh và không tĩnh."

"Tôi đã sẵn sàng."

"Thực sự không có bất kỳ vấn đề nào với việc kế thừa các lớp lồng nhau tĩnh. Chúng được kế thừa giống như các lớp thông thường:"

Ví dụ
public class Car
{
 public static class Door
 {

 }
}

public class LamborghiniDoor extends Car.Door
{
}

"Nhưng chúng ta có thể làm cho các lớp lồng tĩnh kế thừa các lớp lồng tĩnh trong các lớp khác không?"

"Tại sao không?"

Ví dụ
public class Car
{
 public static class Door
 {

 }
}

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

"OK, hiểu rồi. Chúng được kế thừa giống như các lớp thông thường, phải không?"

"Có. Nhưng các lớp lồng nhau không tĩnh (được gọi là các lớp bên trong) không được kế thừa dễ dàng."

"Khi một thể hiện của một lớp bên trong được tạo, một tham chiếu đến lớp bên ngoài của nó được lưu trữ và chuyển hoàn toàn cho hàm tạo."

"Kết quả là, khi bạn tạo các đối tượng của một lớp kế thừa một lớp bên trong, bạn phải chuyển đối tượng bên ngoài được yêu cầu một cách rõ ràng."

"Cái này nó thì trông như thế nào:"

Mã số
public class Car
{
 public class Door
 {

 }
}

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

"Bạn phải hoàn toàn chuyển một đối tượng Car cho hàm tạo Door. Điều này được thực hiện bằng cách sử dụng một cấu trúc đặc biệt: «car.super()»."

"Nhân tiện, nếu bạn cố gắng tạo hàm tạo LamborghiniDoor mà không có bất kỳ tham số nào, chương trình sẽ không biên dịch được. Hơi lạ nhỉ?"

"Vâng, có một vài sắc thái, nhưng nó không phải là khoa học tên lửa."