2016-03-19 14 views
3

diese Verwendung als Beispiel:Klärung über in Java überschreiben

class Animal{ 

    public void move(){ 
     System.out.println("Animals can move"); 
    } 
} 

class Dog extends Animal{ 

    public void move(){ 
     System.out.println("Dogs can walk and run"); 
    } 
} 

public class TestDog{ 

    public static void main(String args[]){ 
     Animal a = new Animal(); // Animal reference and object 
     Animal b = new Dog(); // Animal reference but Dog object 

     a.move();// runs the method in Animal class 

     b.move();//Runs the method in Dog class 
    } 
} 

Ist es richtig zu sagen, hier auf b.move() aufgerufen wird, das Verfahren „move() unter der Dog-Klasse“ hat die „Bewegung außer Kraft gesetzt() unter der Animal-Klasse "wie das Dog-Objekt Vorrang hat, wenn es dieselbe Methode aufruft, wenn es von einem Animal-Typ referenziert wird?

Ich habe bemerkt, dass viele Websites dies nicht erklären, sondern sie werfen einfach Beispiele aus, ohne Zeile für Zeile durch das Zeug zu sprechen. Ich will nur meine terminologische Verwirrung klären.

Eine Randnotiz, wäre es möglich, ein Dog-Objekt zu haben, aber move() aufzurufen, das sich unter der Animal-Klasse befindet? zum Beispiel mit etwas wie:

Dog doggy = new Dog(); 
doggy.move() 
>>> 
Animals can move 
>>> 

Wäre das möglich? Würde ((Tier) doggy) .move() dies erreichen?

+0

zusätzlich verwenden Sie @ Override-Notation, es verhindert, dass Sie Fehler machen, wie Schreibfehler der Methodennamen in Unterklassen. – jam

Antwort

4

tun, es richtig ist, auf zu sagen b.move() die Methode „move() unter der Dog Klasse“ Aufruf hat die „move() unter der Animal Klasse“ außer Kraft gesetzt.

Für die zweite Frage, die Klasse Hund als implementieren sollten:

public class Dog extends Animal { 

    public void move(){ 
    super.move(); 
    } 
} 

Für die dritte Frage ist die Antwort „NEIN“.

  ((Animal) doggy).move() 

Das ist einfach ‚überflüssig‘ und der Ausgang „move() unter der Dog Klasse“ geben.

0

Verwenden Sie das Schlüsselwort super, um die Elternelementfunktionen oder Datenelemente aufzurufen.

mögen: super.move(); In diesem Fall wird Ihre Elternfunktion aufgerufen.

0

Aus den oracle docs

Wenn zwei oder mehr unabhängig definierten Standardmethoden Konflikt oder eine Standardmethode Konflikten mit einer abstrakten Methode, dann wird die Java-Compiler erzeugen einen Compiler-Fehler. Sie müssen die übergeordneten Methoden explizit überschreiben.

Also im Grunde, wenn Sie in der Unterklasse sind eine Methode aufrufen, die in der übergeordneten Klasse ist, werden Sie nicht in der Lage sein, die übergeordnete Klasse Methode aufrufen, wenn Sie super.function() verwenden. Read up more on it here

1

Sie können es wie diese Absolut

class Animal{ 

    public void move(){ 
     System.out.println("Animals can move"); 
    } 
} 

class Dog extends Animal{ 

    public void move(){ 
     System.out.println("Dogs can walk and run"); 
    } 

    public void moveParent() { 
     super.move(); 

    } 

} 

public class Main{ 

    public static void main(String args[]){ 
     Animal a = new Animal(); // Animal reference and object 
     Animal b = new Dog(); // Animal reference but Dog object 

     a.move();// runs the method in Animal class 

     b.move();//Runs the method in Dog class 

     Dog doggy = new Dog(); 
     doggy.moveParent(); 

    } 
} 
0

Es ist Prinzip der objektorientierten Programmierung (aka OOP) - Polymorphismus. Hund, Katze, Elefant sind alle tierisch.

Animal d = new Dog(); 
Animal c = new Cat(); 
Animal t = new Tiger() 

Es muss sich nicht kümmern, immer richtig.:)