2013-05-01 3 views
6

Ich entschuldige mich für meine triviale und wahrscheinlich alberne Frage, aber ich bin ein wenig verwirrt, wann das "this" Präfix verwenden, wenn eine Methode oder Zugriff auf etwas verwenden.Wann "this" in Java

Zum Beispiel, wenn wir uns auf Platz # 4 hier: http://apcentral.collegeboard.com/apc/public/repository/ap_frq_computerscience_12.pdf

Und schauen wir uns die Lösungen hier: http://apcentral.collegeboard.com/apc/public/repository/ap12_computer_science_a_q4.pdf

Wir sehen, dass eine Lösung a) zu trennen ist

public int countWhitePixels() { 
int whitePixelCount = 0; 
    for (int[] row : this.pixelValues) { 
     for (int pv : row) { 
     if (pv == this.WHITE) { 
     whitePixelCount++; 
     } 
    } 
    } 
return whitePixelCount; 
} 

während eine andere Lösung ist

public int countWhitePixels() { 
int whitePixelCount = 0; 
    for (int row = 0; row < pixelValues.length; row++) { 
     for (int col = 0; col < pixelValues[0].length; col++) { 
     if (pixelValues[row][col] == WHITE) { 
     whitePixelCount++; 
    } 
    } 
} 
return whitePixelCount; 
} 

Hier ist meine Frage. Warum benutzen sie das "Dies"? Präfix beim Zugriff auf Pixelwerte und sogar Weiß in der ersten Lösung, aber nicht in der zweiten? Ich dachte "das" war implizit, also bin ich richtig, wenn ich "das" sage. ist für die erste Lösung überhaupt nicht notwendig?

Vielen Dank für Ihre Hilfe :)

+0

Termionogly bitte. Es gibt keine "Befehle" in Java, und "das" gehört nicht dazu. – EJP

Antwort

1

Wenn der Name eines Verfahrensparameters das gleiche wie einer Ihrer Klassendaten Mitglied ist; Um auf das Datenelement zu verweisen, müssen Sie this. davor setzen. Zum Beispiel in der Funktion setA():

public void setA(int a) 
{ 
    this.a = a; 
} 

Da sowohl das Datenelement und das papameter des Verfahrens a genannt wird, auf das Datenelement zu verweisen, müssen Sie this.a verwenden. In anderen Fällen ist es nicht erforderlich.

Und in Ihrem Fall glaube ich nicht, dass es notwendig ist, die this zu verwenden, obwohl es keinen Schaden gibt, es zu verwenden.

0

this beziehen sich auf die Instanz der Klasse selbst. Beispiel:

private String name, car; 

public class Car(String name, String color) 
{ 
    this.name = name; 
    this.color = color; 
} 
6

Mit this finden Sie ausdrücklich auf die Objektinstanz, wo Sie sind. Sie können dies nur in Instanzmethoden oder Initialisierungsblöcken tun, aber Sie können dies nicht in static Methoden oder Klasseninitialisierungsblöcken tun.

Wenn Sie das brauchen?

Nur in Fällen, in denen eine gleichnamige Variable (lokale Variable oder Methodenparameter) die Deklaration ausblenden. Beispiel:

private int bar; 
public void setBar(int bar) { 
    this.bar = bar; 
} 

Hier blendet der Methodenparameter die Instanzeigenschaft aus.

Wenn Kodierer es benutzt haben?

Um die Lesbarkeit zu verbessern, ist es üblich, dass die Programmierer das this. Qualifikationsmerkmal vor dem Zugriff auf eine Instanzeigenschaft vorgeben. Z.B.:

public int getBar() { 
    return this.bar; 
    // return bar; // <-- this is correct, too 
} 
+2

+1 für die Erstellung einschließlich "Lesbarkeit". Ich denke, Code Lesbarkeit kann nicht genug betont werden. In dem Beispiel (eine einfache Accessor-Methode) ist es wahrscheinlich übertrieben, aber es gibt viele Situationen, in denen es die Lesbarkeit erheblich verbessert. – GreyBeardedGeek

+0

IMO 'return this.bar;' ist weniger lesbar als 'return bar;'. Es ist nur mehr Unordnung. –

+0

Vereinbart @SteveKuo, sollten Sie die IDE veranlassen, zwischen lokalen Variablen und Klassenattributen mit Hilfe von Farbschemata zu unterscheiden, anstatt JEDES ZEITPUNKT das 'this.'-Schlüsselwort manuell ohne tatsächliche Verwendung zu setzen, außer das Hinzufügen von Ausführlichkeit. @GreyBeardedGeek: Verwenden Sie Notepad oder eine _proper_ IDE für die Entwicklung? ;-) – klaar

4

Von The Java™ Tutorials

dies mit einem Feld Mit

Der häufigste Grund, die dieses Schlüsselwort für die Verwendung ist, weil ein Feld durch ein Verfahren oder Konstruktorparameter beschattet ist.

Zum Beispiel wurde die Point-Klasse wie diese

public class Point { 
    public int x = 0; 
    public int y = 0; 

    //constructor 
    public Point(int a, int b) { 
     x = a; 
     y = b; 
    } 
} 

geschrieben, aber es könnte so geschrieben wurde:

public class Point { 
    public int x = 0; 
    public int y = 0; 

    //constructor 
    public Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
}