Overriding vs Hiding Java - Verwirrt

Ich bin verwirrt darüber, wie sich Überschreiben von Verstecken in Java unterscheidet. Kann jemand nähere Angaben zu den Unterschieden machen? Ich lese dasJava Tutorial aber der Beispielcode hat mich immer noch verwirrt.

Um es klarer zu machen, ich verstehe Overriding gut. Mein Problem ist, dass ich nicht sehe, dass das Verstecken anders ist, mit Ausnahme der Tatsache, dass sich einer auf der Instanzebene befindet, während sich der andere auf der Klassenebene befindet.

Sehen Sie sich den Java-Tutorial-Code an:

public class Animal {
    public static void testClassMethod() {
        System.out.println("Class" + " method in Animal.");
    }
    public void testInstanceMethod() {
        System.out.println("Instance " + " method in Animal.");
    }
}

Dann haben wir eine Unterklasse Katze:

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();
    }
}

Dann sagen sie:

Die Ausgabe dieses Programms ist wie folgt:

Klassenmethode in Animal.

Die Instanzmethode in Cat.

Für mich ist die Tatsache, dass der Aufruf einer Klassenmethode testClassMethod () direkt aus der Animal-Klasse die Methode in der Animal-Klasse ausführt, ziemlich offensichtlich, nichts Besonderes. Dann rufen sie die testInstanceMethod () von einem Verweis auf myCat auf, was wiederum ziemlich offensichtlich ist, dass die dann ausgeführte Methode die in der Instanz von Cat ist.

Anhand dessen, was ich sehe, verhält sich das Ausblenden des Anrufs wie das Überschreiben. Warum also diese Unterscheidung treffen? Wenn ich diesen Code mit den oben genannten Klassen ausführe:

Cat.testClassMethod();

Ich werde bekommen:Die Klassenmethode in Cat. Aber wenn ich testClassMethod () von Cat entferne, bekomme ich:Die Klassenmethode in Animal.

Das zeigt mir, dass das Schreiben einer statischen Methode mit derselben Signatur wie in der übergeordneten Methode in einer Unterklasse so ziemlich einen Override bewirkt.

Hoffentlich mache ich klar, wo ich verwirrt bin und jemand etwas Licht ins Dunkel bringen kann. Vielen Dank im Voraus!

Antworten auf die Frage(13)

Ihre Antwort auf die Frage