Horse
そのクラスがクラスのサブクラスであると仮定しAnimal
ます。
Horse
a と c はどちらもクラスでメソッドとインスタンス変数を使用しますc は
Animal
クラスのメソッドも使用できます。これら2つの参照変数の間に違いはありますか。
返信ありがとうございます
Horse
そのクラスがクラスのサブクラスであると仮定しAnimal
ます。
Horse
a と c はどちらもクラスでメソッドとインスタンス変数を使用します
c はAnimal
クラスのメソッドも使用できます。これら2つの参照変数の間に違いはありますか。
返信ありがとうございます
違う。は として宣言されていないため、クラス
a
だけでメソッドを使用することはできません。Horse
a
Horse
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
を呼び出すことができるのはそれだけです。Horse
a
Horse は Animal から継承されますか?
その場合は、Super.[動物からのメソッド] と Horse.[馬のみからのメソッド] を呼び出します。
Horse は継承されているため、animal からすべてのメソッドにアクセスできますが、animal は horse のみに固有であるため、 horse からのメソッドにアクセスできません。
型キャストされていない限り、オブジェクトa
はメソッド/変数を参照できません。Horse