-1

たとえば、VolksWagen extends Car

そして、次のことを行います

Car abc = new VolksWagen();

ここで正確に何が起こりますか?

たとえばVolksWagen()、特定のメソッドがある場合abc、これらのメソッドはありません。フォルクスワーゲンが子で、車が親であるため、親は子からメソッドを継承しないため..しかし、私は何を知りたい違いは

Car abc = new VolksWagen();

Car def = new Car();

4

5 に答える 5

2

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;

于 2013-09-17T19:06:18.183 に答える
0

AVolkswagenは、変数Volkswagenに格納しても a のままです。CarキャストabcしてVolksWagen、そのメソッドにアクセスできます。

defにキャストすることはできませんVolksWagen

于 2013-09-17T19:04:52.913 に答える
0

通常、Car抽象基本クラスになるため、直接インスタンス化することはできません。利点は、コード内で任意の型を処理でき、正確な型を知らなくても、たとえばCar単純に呼び出すことができることです。drive()各サブクラスのdriveメソッドは、少し異なる処理を行うことができます (たとえば、1 マイルあたりのガス消費量が異なるなど)。

また、インスタンスを割り当てるクラスにこだわらないでください。これは、Java のような静的に型付けされた言語がどのように機能するかの成果物にすぎません。次のように考える方が簡単です。

var car = new Volkswagon();
var car2 = new Honda();
car.drive();
car2.drive();
performOilChange(car);
performOilChange(car2);
于 2013-09-17T19:08:10.840 に答える
0

Parent a = new Child() と言うと、それは子です。Parent a = new Parent() と言うと、親は子型を継承しないため、子型を使用できません。Child a = new Child() と言うと、拡張により親メソッドを使用できます。

于 2013-09-17T19:09:08.123 に答える
0

これについては多くのことを話すことができますが、主な違いは次のとおりです。

Car abc = new VolksWagen();

Car のすべてのメソッドにアクセスできますが、メソッドがオーバーライドされVolksWagenている場合は呼び出されます。

Car def = new Car();

のメソッドのみCarが呼び出されます。

乾杯 !!

于 2013-09-17T19:11:03.170 に答える