2017-01-13 6 views
1

Ich habe es schwer, einige Prinzipien über das Übersteuern und Überladen zu verstehen.Java-Methode Auswahl mit Überladung und Überschreiben

public class Figure{ 
    public void stampa(Figure f){ 
     System.out.println("Figure"); 
    } 
} 
public class Square extends Figure{ 
    public void stampa(Square q){ 
     System.out.println("Square"); 
    } 
} 
public class Rectangle extends Square{ 
    public void stampa(Rectangle r){ 
     System.out.println("Rectangle"); 
    } 
    public void stampa(Square r){ 
     System.out.println("Particular Rectangle"); 
    } 
    public void stampa(Figure f){ 
     System.out.println("Particular Figure"); 
    } 
} 

public class Test{ 
    public static void main(String args[]){ 

     Figure f1,f2; 
     Square q = new Rectangle(); 
     Rectangle r = new Rectangle(); 
     f1 = new Square(); 
     f2 = new Rectangle(); 

     f1.stampa(f2); //Figure 
     q.stampa(r); //Particular Rectangle 
     f1.stampa(q); //Figure 
     q.stampa(f1); //Particular Figure 
     q.stampa(q); //Particupar Rectangle 
    } 
} 

Ich weiß, dass public void stampa(Square q)public void stampa(Figure f) ist Überlastung und overrding es nicht.

Und und public void stampa(Figure f) überladen auch public void stampa(Square q).

Auch public void stampa(Square q) in Rectangle-Klasse überschreibt die Methode in Square-Klasse.

Erste Frage

es zu diesem Ergebnis: q.stampa(f1); //Particular Figure Ich weiß, dass zum Zeitpunkt der Kompilierung q ist ein Square so werde ich bei dieser Methode sucht public void stampa(Square q) in Square Klasse. und zur Laufzeit q ist Rectangle so dachte ich, könnte das Ergebnis „Besondere Rectangle“ statt „Besonderen Bild“ seine

nicht sicher, was ich falsch mache

Zweite Frage

Wenn in diesem Moment Rectangle erstreckt Figure und nicht mehr Square, werde ich sicher Kompilierungsfehler auf Square q = new Rectangle(); haben, was mit dem Varibale geschieht q (es wird eine solche Variable als Square q oder wir haben werden, habe keine v Arible mit Namen q?) und was wird das Ergebnis von q.stampa(f1);

Vielen Dank und Entschuldigung für mein Englisch und bitte korrigieren Sie mich, wenn ich falsch liege.

+0

* "Zweite Frage" * ... Nein, nur eine Frage pro Beitrag, nicht zwei. – Tom

+0

Ihre Klasse ist definiert als 'Figura'. Wenn dies nicht nur ein Tipp zum Kopieren und Einfügen ist, würde dies einige Probleme verursachen. – kunruh

+0

@kunruh Danke, ich reparierte es – totoro

Antwort

3

Ich weiß, dass zum Zeitpunkt der Kompilierung q ist ein Square so werde ich bei dieser Methode sucht public void stampa(Square q) in Square-Klasse.

Sie vergessen, dass Square enthält zwei Methoden: stampa(Square q) und stampa(Figure f). Letzteres wird von Figure geerbt und wird zur Kompilierungszeit als am meisten nur geeignete Überlast ausgewählt.

und zur Laufzeit q ist rechteckig, so dachte ich, könnte das Ergebnis „Besondere Rectangle“ statt „Besonderes Bild“

Überlastungen bei der Kompilierung und Überschreibungen zur Laufzeit ausgewählt werden, sein. Wie bereits erwähnt, ist stampa(Figure f) bereits zur Kompilierzeit ausgewählt. Sobald es tatsächlich aufgerufen wird, sieht die Laufzeitumgebung, dass eine Instanz von Rectangle ist und delegiert den Aufruf an Rectangle.stampa(Figure f).

Wie für die zweite Frage, ich verstehe nicht wirklich, was Sie fragen. Ein Kompilierungsfehler bedeutet, dass der Code ungültig ist und nichts passiert. q.stampa(f1) wird niemals aufgerufen und gibt niemals ein Ergebnis zurück.

3

Erste Frage:

q ‚s deklarierten Typ ist Platz. f1 ist der erklärte Typ ist Abbildung. Daher sucht der Compiler nach einer Methode namens stampa in der Klasse Square und seinen Oberklassen, wenn eine Methode existiert, die eine Figur (oder eine Superklasse von Figure) akzeptiert. Es findet eine Abbildung: public void stampa(Figure f). Zur Kompilierungszeit zählt der deklarierte Typ der Variablen.

Jetzt wird zur Laufzeit der tatsächliche Laufzeittyp des Objekts, das von q referenziert wird, untersucht: es ist ein Rectangle. Die Laufzeitumgebung sucht also nach einer Methode public void stampa(Figure f), die die Figure-Methode in Rectangle und alle ihre Superklassen bis Abbildung überschreibt. Das ermöglicht Polymorphie. Es findet man in Rechteck:

public void stampa(Figure f) { 
    System.out.println("Particular Figure"); 
} 

Zweite Frage:

Sie wird in der Tat einen Übersetzungsfehler, also Argumentation über die Art der Variablen q macht keinen Sinn: es wird keine solche Variablen sein, da der Code nicht kompiliert und die Klasse somit nicht vom Compiler generiert wird.

Verwandte Themen