Kurs Java Podstawy - rozszerzony

Parametry i słowo kluczowe this

W Javie metody i konstruktory mogą być zarówno bez parametrów jak i przyjmować ich różną ilość. Można je podzielić na dwa zasadnicze typy:

-parametry jawne (explicit parametr)

-parametry niejawne (implicit parametr)

Zobaczmy to na przykładzie. Powiedzmy, że mamy klasę Punkt postaci:

public class Punkt {
	int x;
	int y;

	public Punkt(int a, int b){
		x = a;
		y = b;
	}

	public void setPunkt(int a, int b){
		x = a;
		y = b;
	}
}

W innej klasie możemy utworzyć obiekt tej klasy i zmienić pola x i y przy pomocy metody setPunkt():

Punkt punkt = new Punkt(0, 0);
punkt.setPunkt(5, 6);

Działanie metody setPunkt() w powyższym przykładzie wygląda w zasadzie tak:

this.x = 5;
this.y = 6;

Widzimy tutaj niejawny parametr postaci this - jest to obiekt na rzecz którego wywoływana jest dana metoda. Parametry jawne to 5 oraz 6, które przypisujemy do pól x i y.

Parametr this jest przez niektórych programistów zapisywany w kodzie dzięki czemu pozwala w prosty sposób odróżnić parametry od zmiennych lokalnych.

Inne zastosowanie słowa kluczowego this znajdziemy w przypadku, gdy w jakiejś klasie posiadamy zmienne o takich samych nazwach jak parametry metod, czy konstruktorów - w końcu nie zawsze chce nam się wymyślać coś nowego, albo po prostu ciężko znaleźć zamiennik.

W naszej klasie Punkt sytuacja taka jest w przypadku pól x i y oraz parametrów konstruktora i metody setPunkt(). Jako argumenty podajemy współrzędne punktu na płaszczyźnie, więc bezsensowne jest nazywanie ich a i b. Dzięki słowu kluczowemu this mogą się nazywać tak samo jak pola klasy:

public class Punkt {
	int x;
	int y;

	public Punkt(int x, int y){
		this.x = x;
		this.y = y;
	}

	public void setPunkt(int x, int y){
		this.x = x;
		this.y = y;
	}
}

<- Poprzednia LekcjaNastępna Lekcja ->

Komentarze

YeeeZooo

Czy to:
-parametry jawne (implicit parametr)
-parametry niejawne (explicit parametr)
czasem nie jest odwrotnie niejawne to implicit?

Slawek

jest, dzięki :)

Nieznany

Czemu niema zadań od tego momentu?

Co się stało?

Kelzaer

Pewnie brak weny na wymyślanie nowych zadań, dla nas matołków ;)

Ragas

haha zadanie specjalnie dla Ciebie:

zamiast nazw składowych w konstruktorach i metodach użyj parametru niejawnego :D
zamień we wszystkich przykładach z kursu :D

Tomek

Kurs jest naprawdę świetny. W necie definicji tego jest pełno. Przykłady na plikach po 150 lini kodu.
A tu czysto i przyjemnie.
No i nadzieja w kursie androida, o co na Polskich stronach jest ciężko, a ten SDK pod androida działa tak topornie, że metoda prób i błędów odpada :)
Pozdrawiam

Piotrek

Czy kurs nadal jest edytowany?

aleksanderwiel

Jeszcze mam jeden problem odnośnie tego tematu, bo próbowałem zastosować tą technikę, ale coś się nie udało, bo po zastosowaniu "this" wywala mi błędy dla pól x i y. Oto moje klasy:

/*Pierwsza klasa, która przekazuje dane*/

public class Położenie {
int x;
int y;

public Położenie(int wspX, int wspY) {
x = wspX;
y = wspY;
}
public void ustawPołożenie(int wspX, int wspY) {
x = wspX;
y = wspY;
}
}


/*Ta klasa odbiera dane, zmienia je, wypisuje na ekranie i tu jest błąd*/

public class Sprawdź_Położenie {

public void main(String args[]) {
Położenie p = new Położenie(0, 0);
this.x = 3;
this.y = 4;

System.out.println("Wynik dodawania: "+this.x+" + "+this.y+" = "+(this.x + this.y));
}
}

Otóż, błędy mi wyrzuca w tej drugiej klasie przy każdym "this.x" i "this.y", podkreśla mi błąd w tych "x" i "y".
Proszę o pomoc, czy coś źle zrobiłem?

aleksanderwiel

Mogę prosić o pomoc do zadania powyżej? Wiem, że coś źle zrobiłem, teraz trochę lepiej już to zrozumiałem, ale chciałbym w tej pierwszej Klasie utworzyć dwa Konstruktory takie jak dotąd robiliśmy na lekcjach. Jeden powinien mieć zmienne: "int x = 0; i int y = 0;", to oczywiste ale problemy zaczynają się przy drugim, bo chcę przypisać zmienne "x i y" do zmiennych "WspX i WspY", w drugiej klasie chcę wywołać obiekt tej pierwszej klasy i użyć parametrów niejawnych. Czy jest taka możliwość, jeżeli tak to proszę o pomoc opartą na kodzie źródłowym, bo nie do końca to zrozumiałem. :/

lolo

Chcesz napisać taki konstruktor?
public Położenie(int wspX, int wspY) {
wspX = x;
wspY = y;
}

Bo nie do końca rozumiem to co chcesz zrobić

aleksanderwiel

Miałem zamiar napisać konstruktor lub metodę z wykorzystaniem słówka kluczowego "this", np.
public Położenie(int WspX, int WspY) {
this.WspX = x;
this.WspY = y;
}
Naprawdę nie rozumiem, dlaczego nie można tak zrobić, czy ktoś może mi to objaśnić? A gdzie się w ogóle podział autor tego tematu, że nie chce mi pomóc?

lolo

Próbujesz przypisać jakąś wartość do pobranych przez siebie w konstruktorze argumentów. Nie możesz tego zrobić gdyż słówko this, służy do identyfikacji składowych obiektu. A parametry pobrane w konstruktorze nie są składowymi obiektu. W jakim celu chcesz to zrobić?

Dawid Kunert

Słowo kluczowe this działa troszkę inaczej niż ty to zrozumiałeś. Pozwala ono, na edycję zmiennej globalnej mającej tą samą nazwę co lokalna(w parametrze). W twoim przypadku w klasie "Sprawdź_Położenie" nie masz zmiennych globalnych x i y, dlatego wyrzuca ci błędy.

Jeżeli chcesz zmienić wartość x i y korzystając z innej klasy to masz parę możliwości. Trzy najłatwiejsze z nich to
1) Korzystasz z metody ustawPołożenie(int wspX, int wspY) w klasie "Położenie". Żeby skorzystać z tego rozwiązania musisz utworzyć obiekt klasy "Położenie" w "Sprawdź_Położenie". Do wydrukowania potrzebne będą ci getery ( getX(){ return x; } )
2) Jeżeli twoje zmienne x i y są publiczne, to możesz utworzyć obiekt i odwoływać się bezpośrednio do nich.
3) Klasa Sprawdź_Położenie może dziedziczyć po Położenie i wtedy będziesz mógł pracować normalnie na x i y.

aleksanderwiel

Zastanawiam się, czemu nie ma zadań do tej lekcji. Wiem, że trochę głupie by one były, bo temat jest taki średni, ale przydałyby się jakieś :)