2013-05-01 14 views
6

Przepraszam za moje banalne i prawdopodobnie głupie pytanie, ale jestem trochę zdezorientowany, kiedy użyć tego "prefiksu", kiedy używam metody lub uzyskuję dostęp do czegoś.Kiedy używać "tego" w Javie

Na przykład, jeśli spojrzymy na # 4 tutaj: http://apcentral.collegeboard.com/apc/public/repository/ap_frq_computerscience_12.pdf

I patrzymy na rozwiązaniach tutaj: http://apcentral.collegeboard.com/apc/public/repository/ap12_computer_science_a_q4.pdf

Widzimy, że jedno rozwiązanie część A) jest

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

a innym rozwiązaniem jest

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

Oto moje pytanie. Dlaczego używają "tego". prefiks podczas uzyskiwania dostępu do wartości pixelValues, a nawet WHITE w pierwszym rozwiązaniu, ale nie w drugim? Myślałem, że "to" jest ukryte, więc mam rację mówiąc "to". NIE jest w ogóle konieczne dla pierwszego rozwiązania?

bardzo dziękuję za pomoc :)

+0

Termionogly proszę. W Javie nie ma "poleceń", a "to" nie jest jednym z nich. – EJP

Odpowiedz

1

Kiedy nazwa parametru metoda jest taka sama jak jednego członka swojej klasie danych; Następnie, aby odnieść się do elementu danych, musisz umieścić przed nim this.. Na przykład, w funkcji setA():

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

Ponieważ zarówno element danych i papameter metody nazwie a, aby odnosić się do elementu danych, trzeba użyć this.a. W innych przypadkach nie jest to wymagane.

W twoim przypadku nie uważam, aby konieczne było korzystanie z this, ale nie zaszkodzi go użyć.

0

this odnoszą się do wystąpienia samej klasy. Przykład:

private String name, car; 

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

Z this jawnie odwołujesz się do instancji obiektu, w którym się znajdujesz. Możesz to zrobić tylko w metodach instancji lub blokach inicjalizujących, ale nie możesz tego zrobić w metodach lub blokach inicjalizujących klasy static.

Kiedy jest to potrzebne?

Tylko w przypadkach, gdy zmienna o tej samej nazwie (zmienna lokalna lub parametr metody) to , ukrywając deklarację pod numerem. Na przykład:

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

Tutaj parametr metody ukrywa właściwość instancji.

Kiedy używano koderów?

Aby poprawić czytelność, powszechną praktyką jest, że programiści przed dodaniem właściwości instancji dodają kwalifikator this.. Na przykład.:

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

+1 za wykonanie, w tym "Czytelność". Myślę, że czytelność kodu nie może być wystarczająco zestresowana. W tym przykładzie (prosta metoda dostępu) jest to prawdopodobnie przesada, ale istnieje wiele sytuacji, w których znacznie poprawia ona czytelność. – GreyBeardedGeek

+0

IMO 'return this.bar;' jest mniej czytelny niż 'return bar;'. To po prostu więcej bałaganu. –

+0

Uzgodnione @SteveKuo, powinieneś pozwolić IDE zadbać o rozróżnienie między zmiennymi lokalnymi i atrybutami klas za pomocą schematów kolorów, zamiast KAŻDEGO CZASU umieszczając słowo kluczowe "tamto" ręcznie bez faktycznego użycia innego niż dodanie gadatliwości. @GreyBeardedGeek: czy używasz notatnika lub _proper_ IDE do programowania? ;-) – klaar

4

Od The Java™ Tutorials

Stosując ten z polem

Najczęstszym powodem korzystania z tego słowa kluczowego jest, ponieważ pole jest zasłonięta przez parametr metody lub konstruktora.

Na przykład klasa Punkt został napisany jak ten

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

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

ale mogło być napisane tak:

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

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