
「こんにちは、アミーゴ!」
「こんにちは、キム。」
「静的および非静的ネストされたクラスの継承について説明したいと思います。」
"準備できました。"
「静的ネストされたクラスの継承には実際には何の問題もありません。それらは通常のクラスと同じように継承されます。」
例
public class Car
{
public static class Door
{
}
}
public class LamborghiniDoor extends Car.Door
{
}
「しかし、静的にネストされたクラスが他のクラスの静的にネストされたクラスを継承できるようにすることはできるでしょうか?」
"なぜだめですか?"
例
public class Car
{
public static class Door
{
}
}
public class Lamborghini extends Car
{
public static class LamborghiniDoor extends Car.Door
{
}
}
「わかりました。通常のクラスと同じように継承されますね?」
「はい。しかし、非静的入れ子クラス (内部クラスと呼ばれる) は、それほど簡単には継承されません。」
「内部クラスのインスタンスが作成されると、その外部クラスへの参照が保存され、暗黙的にコンストラクターに渡されます。」
「その結果、内部クラスを継承するクラスのオブジェクトを作成するときは、必要な外部オブジェクトを明示的に渡す必要があります。」
「見た目はこんな感じです。」
コード
public class Car
{
public class Door
{
}
}
public class LamborghiniDoor extends Car.Door
{
LamborghiniDoor(Car car)
{
car.super();
}
}
「暗黙的に Car オブジェクトを Door コンストラクターに渡す必要があります。これは特別な構造体 «car.super()» を使用して行われます。」
「ところで、パラメーターを何も指定せずに LamborghiniDoor コンストラクターを作成しようとすると、プログラムはコンパイルできません。少し奇妙ですよね?」
「はい、いくつかのニュアンスはありますが、それはロケット科学ではありません。」
GO TO FULL VERSION