オーバーライドとJavaでの非表示の違いについて混乱しています。これらの違いについて誰かが詳細を提供できますか?Javaチュートリアルを読みましたが、サンプルコードはまだ混乱していました。
より明確にするために、私はオーバーライドをよく理解しています。私の問題は、一方がインスタンスレベルにあり、もう一方がクラスレベルにあるという事実を除いて、非表示がどのように異なるかがわからないことです。
Javaチュートリアルコードを見る:
public class Animal {
public static void testClassMethod() {
System.out.println("Class" + " method in Animal.");
}
public void testInstanceMethod() {
System.out.println("Instance " + " method in Animal.");
}
}
次に、サブクラスがありCat
ます。
public class Cat extends Animal {
public static void testClassMethod() {
System.out.println("The class method" + " in Cat.");
}
public void testInstanceMethod() {
System.out.println("The instance method" + " in Cat.");
}
public static void main(String[] args) {
Cat myCat = new Cat();
Animal myAnimal = myCat;
Animal.testClassMethod();
myAnimal.testInstanceMethod();
}
}
それから彼らは言う:
このプログラムからの出力は次のとおりです。
動物のクラスメソッド。
Catのインスタンスメソッド。
私にとって、クラスtestClassMethod()
から直接クラスメソッドを呼び出すと、クラス内のメソッドがAnimal
実行されるという事実Animal
は非常に明白であり、特別なことは何もありません。次にtestInstanceMethod()
、を参照からに呼び出します。そのmyCat
ため、実行されたメソッドがCat
。のインスタンスのメソッドであることは明らかです。
私が見たところ、通話の非表示はオーバーライドと同じように動作するのに、なぜその区別をするのでしょうか。上記のクラスを使用してこのコードを実行すると、次のようになります。
Cat.testClassMethod();
取得します:
Catのクラスメソッド。
しかしtestClassMethod()
、Catからを削除すると、次のようになります。Animal
のclassメソッド。
これは、親と同じ署名を持つ静的メソッドをサブクラスに書き込むと、ほとんどオーバーライドされることを示しています。
うまくいけば、私は混乱している場所を明確にし、誰かが光を当てることができます。よろしくお願いします!