0

Horseそのクラスがクラスのサブクラスであると仮定しAnimalます。

  • Horsea と c はどちらもクラスでメソッドとインスタンス変数を使用します

  • c はAnimalクラスのメソッドも使用できます。これら2つの参照変数の間に違いはありますか。

返信ありがとうございます

4

6 に答える 6

10

違う。は として宣言されていないため、クラス
aだけでメソッドを使用することはできません。HorseaHorse

于 2012-05-07T16:05:02.077 に答える
2

1 つはインターフェイスへのプログラミング、もう 1 つはインスタンスへのプログラミングです。

最初のもので:

Animal a = new Horse();

このオブジェクトは、動物のインスタンスが必要な場所ならどこでも使用でき、どのような種類の動物でもかまいません。

Animal d = new Dog();

public void MakeSound(Animal a)
{
 a.makeSound();
}

この場合、Animal クラスが抽象クラス (メソッドが抽象の場合) またはインターフェイスである場合、そのメソッドを実装する必要があります。

Horse クラスにはメソッドがありますが、使用する場合にのみこれらのメソッドを使用できますHorse h = new Horse();

インターフェイスへのプログラミングが推奨されます。

于 2012-05-07T16:06:07.290 に答える
1

一般的に言えば、読みやすくするために、その使用法と互換性のある最も特定性の低い変数タイプを常に優先する必要があります。実際には、 のList代わりに varを使用すると、コードにArrayList固有のものは何も必要ないことが明らかになりArrayListます。

于 2012-05-07T16:06:38.617 に答える
0

ここで確認する2つの重要な概念があります。参照の静的タイプ。これは宣言されたものです。および参照の実行時タイプ。これは、参照が実行時に指す実際のタイプです。

この例では、両方の変数の実行時タイプHorseはですaが、静的タイプはAnimalです。これは、コード内の両方の変数の処理方法に影響を与えます。静的型はコンパイラーによって強制されます。ランタイムタイプに関係なく。

したがって、両方ともHorseインスタンスを参照していても、 (キャストしたり、リフレクションを使用したりせずに)特定のメソッドcを呼び出すことができるのはそれだけです。Horsea

于 2012-05-07T16:25:00.280 に答える
0

Horse は Animal から継承されますか?

その場合は、Super.[動物からのメソッド] と Horse.[馬のみからのメソッド] を呼び出します。

Horse は継承されているため、animal からすべてのメソッドにアクセスできますが、animal は horse のみに固有であるため、 horse からのメソッドにアクセスできません。

于 2012-05-07T16:12:23.177 に答える
0

型キャストされていない限り、オブジェクトaはメソッド/変数を参照できません。Horse

于 2012-05-07T16:07:12.767 に答える