たとえば、VolksWagen extends Car
そして、次のことを行います
Car abc = new VolksWagen();
ここで正確に何が起こりますか?
たとえばVolksWagen()
、特定のメソッドがある場合abc
、これらのメソッドはありません。フォルクスワーゲンが子で、車が親であるため、親は子からメソッドを継承しないため..しかし、私は何を知りたい違いは
Car abc = new VolksWagen();
と
Car def = new Car();
たとえば、VolksWagen extends Car
そして、次のことを行います
Car abc = new VolksWagen();
ここで正確に何が起こりますか?
たとえばVolksWagen()
、特定のメソッドがある場合abc
、これらのメソッドはありません。フォルクスワーゲンが子で、車が親であるため、親は子からメソッドを継承しないため..しかし、私は何を知りたい違いは
Car abc = new VolksWagen();
と
Car def = new Car();
Car を拡張すると、まったく新しいクラス VolksWagen がそのすべてのメソッドを継承します。これは、少なくとも Car で定義されたすべてのメソッドを持っていることを意味します。
WolksVagen には少なくともCar のメソッドがあるため、クラス Car の任意のメソッドを呼び出しても VolksWagen オブジェクトでも機能するため、Car 型の変数に割り当てても問題ないと見なされます。
これにより、たとえば、任意の車で機能する他のメソッドを作成できます。
void smash(Car car) {
// ....
}
Car c = new VolksWagen();
smash(c); // Okay since c has all of Car's methods
この割り当てによってメソッドが「失われる」ことはありませんが、変数を使用してアクセスすることはできませんc
。を使用して、いつでもフォルクスワーゲン オブジェクトに戻すことができます。VolksWagen v = (VolksWagen)c;
AVolkswagen
は、変数Volkswagen
に格納しても a のままです。Car
キャストabc
してVolksWagen
、そのメソッドにアクセスできます。
def
にキャストすることはできませんVolksWagen
。
通常、Car
抽象基本クラスになるため、直接インスタンス化することはできません。利点は、コード内で任意の型を処理でき、正確な型を知らなくても、たとえばCar
単純に呼び出すことができることです。drive()
各サブクラスのdrive
メソッドは、少し異なる処理を行うことができます (たとえば、1 マイルあたりのガス消費量が異なるなど)。
また、インスタンスを割り当てるクラスにこだわらないでください。これは、Java のような静的に型付けされた言語がどのように機能するかの成果物にすぎません。次のように考える方が簡単です。
var car = new Volkswagon();
var car2 = new Honda();
car.drive();
car2.drive();
performOilChange(car);
performOilChange(car2);
Parent a = new Child() と言うと、それは子です。Parent a = new Parent() と言うと、親は子型を継承しないため、子型を使用できません。Child a = new Child() と言うと、拡張により親メソッドを使用できます。
これについては多くのことを話すことができますが、主な違いは次のとおりです。
Car abc = new VolksWagen();
Car のすべてのメソッドにアクセスできますが、メソッドがオーバーライドされVolksWagen
ている場合は呼び出されます。
と
Car def = new Car();
のメソッドのみCar
が呼び出されます。
乾杯 !!