Horseそのクラスがクラスのサブクラスであると仮定しAnimalます。
Horsea と c はどちらもクラスでメソッドとインスタンス変数を使用しますc は
Animalクラスのメソッドも使用できます。これら2つの参照変数の間に違いはありますか。
返信ありがとうございます
Horseそのクラスがクラスのサブクラスであると仮定しAnimalます。
Horsea と c はどちらもクラスでメソッドとインスタンス変数を使用します
c はAnimalクラスのメソッドも使用できます。これら2つの参照変数の間に違いはありますか。
返信ありがとうございます
違う。は として宣言されていないため、クラス
aだけでメソッドを使用することはできません。HorseaHorse
1 つはインターフェイスへのプログラミング、もう 1 つはインスタンスへのプログラミングです。
最初のもので:
Animal a = new Horse();
このオブジェクトは、動物のインスタンスが必要な場所ならどこでも使用でき、どのような種類の動物でもかまいません。
Animal d = new Dog();
public void MakeSound(Animal a)
{
a.makeSound();
}
この場合、Animal クラスが抽象クラス (メソッドが抽象の場合) またはインターフェイスである場合、そのメソッドを実装する必要があります。
Horse クラスにはメソッドがありますが、使用する場合にのみこれらのメソッドを使用できますHorse h = new Horse();
インターフェイスへのプログラミングが推奨されます。
一般的に言えば、読みやすくするために、その使用法と互換性のある最も特定性の低い変数タイプを常に優先する必要があります。実際には、 のList代わりに varを使用すると、コードにArrayList固有のものは何も必要ないことが明らかになりArrayListます。
ここで確認する2つの重要な概念があります。参照の静的タイプ。これは宣言されたものです。および参照の実行時タイプ。これは、参照が実行時に指す実際のタイプです。
この例では、両方の変数の実行時タイプHorseはですaが、静的タイプはAnimalです。これは、コード内の両方の変数の処理方法に影響を与えます。静的型はコンパイラーによって強制されます。ランタイムタイプに関係なく。
したがって、両方ともHorseインスタンスを参照していても、 (キャストしたり、リフレクションを使用したりせずに)特定のメソッドcを呼び出すことができるのはそれだけです。Horsea
Horse は Animal から継承されますか?
その場合は、Super.[動物からのメソッド] と Horse.[馬のみからのメソッド] を呼び出します。
Horse は継承されているため、animal からすべてのメソッドにアクセスできますが、animal は horse のみに固有であるため、 horse からのメソッドにアクセスできません。
型キャストされていない限り、オブジェクトaはメソッド/変数を参照できません。Horse