2013-04-17 8 views
5

Ich sah einige Java-Beispiele, die this Schlüsselwort verwenden, um superclass Methoden zu erhalten. Beispiel: this.superClassMethod(). Im Normalfall würden wir super verwenden. Kann jemand helfen, mit einem Beispiel zu klären, warum der Entwickler this anstelle von super verwendet? Vielen Dank.Warum verwenden "dieses" Schlüsselwort, um superclass Methoden zu erhalten

+0

Wird die Methode in der Unterklasse überschrieben? –

Antwort

17

Es gibt keinen Unterschied zwischen und super.method() bis zu dem genannten method() bekommt überschrieben in der Klasse des Anrufers.

Zum Beispiel mit

class SuperClass { 

    public void method() { 
     System.out.println("SuperClass"); 
    } 

} 

class SubClass extends SuperClass { 

    public SubClass() { 
     method(); 
     this.method(); 
     super.method(); 
    } 

} 

Aufruf

new SubClass(); 

Drucke

SuperClass 
SuperClass 
SuperClass 

Während mit

class SuperClass { 

    public void method() { 
     System.out.println("SuperClass"); 
    } 

} 

class SubClass extends SuperClass { 

    @Override 
    public void method() { 
     System.out.println("SubClass"); 
    } 

    public SubClass() { 
     method(); 
     this.method(); 
     super.method(); 
    } 

} 

Aufruf

new SubClass(); 

Drucke

SubClass 
SubClass 
SuperClass 

Parallel dazu gibt es keinen Unterschied zwischen this.field und super.field bis zu den genannten field bekommt versteckt in der Klasse des Anrufers.

Zum Beispiel mit

class SuperClass { 

    protected String field = "SuperClass"; 

} 

class SubClass extends SuperClass { 

    public SubClass(String field) { 
     System.out.println(field); 
     System.out.println(this.field); 
     System.out.println(super.field); 
    } 

} 

Aufruf

new SubClass("parameter"); 

Drucke

parameter 
SuperClass 
SuperClass 

Während mit

class SuperClass { 

    protected String field = "SuperClass"; 

} 

class SubClass extends SuperClass { 

    private String field = "SubClass"; 

    public SubClass(String field) { 
     System.out.println(field); 
     System.out.println(this.field); 
     System.out.println(super.field); 
    } 

} 

Aufruf

new SubClass("parameter"); 

Drucke

parameter 
SubClass 
SuperClass 

Randbemerkung: methods() erhalten außer Kraft gesetzt während fieldserhalten versteckt.

+1

+1 für die prägnante Schlüsselaussage "Es gibt keinen Unterschied zwischen this.method() und super.method(), bis die genannte Methode in der Klasse des Aufrufers überschrieben wird." – TheBlastOne

+4

All dies ist wahr, aber kann verkürzt werden zu: Wenn Sie die superclassmethod aufrufen möchten, verwenden Sie 'super', sonst tun Sie nichts als Standard (ohne' this') immer die "aktuellste Implementierung" wird verwendet. –

+0

Danke Mann. Endlich hab ich es – gjman2

5

Die Verwendung von this ruft nicht die Superklassenmethode auf. Es ist eigentlich überflüssig, weil es spezifisch die Methode dieser Instanz aufruft. Es kann relevant sein, wenn Sie einen anderen Konstruktor derselben Instanz aufrufen möchten, aber ansonsten ist es dasselbe, als würde nur die Methode aufgerufen.

Es kann für variable Scoping nützlich sein (zum Beispiel, wenn gibt es eine lokale Variable mit dem gleichen Namen wie eine Instanzvariable) sicher, dass die Instanz machen Variable verwendet, aber es macht keinen Unterschied, wenn Methoden aufrufen.

persönlich denke, ich würde, dass der Entwickler die Vorteile von Code-Vervollständigung und die IDE zeigt mögliche Methodennamen nach der Eingabe this. :-)

+0

@TheBlastOne Was? –

+0

Falscher Steckplatz: O Entschuldigung – TheBlastOne

+0

OK, ich war zuerst verwirrt :-D –

3

Super verwendet wird, um Zugriffsmethoden der Basisklasse nehmen wollte, während dieser verwendet wird, um auf Methoden der aktuellen Klasse zuzugreifen.

Nur wenige Referenzen
1) usage of this
2) critique on super on SO

den Begriff erweitern, wenn Sie super() schreiben, es bezieht sich auf Konstruktor der Basisklasse, und wenn Sie schreiben diese(), es bezieht sich auf den Konstruktor der Klasse, in der Sie diesen Code schreiben.

class Animal { 
    void eat() { 
    System.out.println("animal : eat"); 
    } 
} 

class Dog extends Animal { 
    void eat() { 
    System.out.println("dog : eat"); 
    } 
    void anotherEat() { 
    super.eat(); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
    Animal a = new Animal(); 
    a.eat(); 
    Dog d = new Dog(); 
    d.eat(); 
    d.anotherEat(); 
    } 
} 

Der Ausgang

animal : eat 
dog : eat 
animal : eat 

Die dritte Zeile "Tier: essen" druckt sein wird, weil wir super.eat() anrufen. Wenn wir dies.eat() nennen würden, wäre es als "Hund: essen" gedruckt worden.

+0

Die "Kritik auf Super" -Referenz bezieht sich eigentlich spezifisch auf den Aufruf von 'super()' von einem Konstruktor, nicht die allgemeine Vorstellung von 'Super'. '. – rob

+0

Warum fügen Sie nicht das zuletzt genannte Beispiel Ihrer Test-Klasse und der Ausgabe hinzu? ;) – rob

0

Viele der Oracle/Sun Java-Code verwendet dies. wenn es um Beispiel muss nicht java \ sehen AWT \ Event.java #translate

public void translate(int dx, int dy) { 
    this.x += dx; 
    this.y +=  
} 

(wenn Sie src.zip und die Suche nach dieser. in * .java extrahieren viele Fälle wie diese sehen, wo die es gibt keine überschreibende lokale Variable/Parameter, aber immer noch verwenden sie diese Art.

Nichts mit params oder Autovervollständigung zu tun (es ist nur x) Ich denke, es ist ein Kodierungsstandard, um klar zu machen, dass wir über eine Methode oder Feld sprechen Strom/diese Klasse

Methode der Basisklasse: Auch wenn noch nicht in unserer cla überfahren ss, kann es zu einem späteren Zeitpunkt sein, so ist seine Zukunft bereit. Bis die Methode überschrieben ist, funktioniert es gut, und wenn es überfahren wird, ist es genau.

Also ich denke, es ist eine Best-Practice-Kodierung Konvention für Klarheit. Es wird den Code nicht aufblähen, da er nicht nur die Syntax Sugar schreibt und der Compiler fügt sie in den Klassencode ein.

Verwandte Themen