Szkolenia programowania we Wrocławiu
Kurs Java Podstawy - rozszerzony

Rozwiązanie 2.3

Zadanie to miało utrwalić różne rodzaje metod i ich zastosowanie. Przede wszystkim należało zwracać uwagę na typ zwracany przez metodę, a także rodzaj argumentów i operacje na nich.

public class Punkt {
	int x;
	int y;

	void zwiekszX(){
		x++;
	}

	void zwiekszY(){
		y++;
	}

	void zmienX(int liczba){
		x += liczba;
	}

	void zmienY(int liczba){
		y += liczba;
	}

	int dajX(){
		return x;
	}

	int dajY(){
		return y;
	}

	void wyswietl(){
		System.out.println("x: "+x+", y: "+y);
	}
}

Przykładowy wygląd klasy Test:

public class Test {
	public static void main(String[] args){
		Punkt punkt = new Punkt();
		punkt.x = 0;
		punkt.y = 0;

		punkt.zwiekszX();
		punkt.zwiekszY();
		punkt.wyswietl();

		punkt.zmienX(10);
		punkt.wyswietl();

		int wartosc = punkt.dajX();
		System.out.println("Wartość: "+wartosc);
	}
}

Komentarze

Komentarze zamknięte. Zapraszamy do grupy na Facebooku
Paweł

Wszystko jasne tylko mam jedno pytanie... Dlaczego metoda
int dajX(){
return x;
}
zwraca wartosc z metody zmienX, czyli 11, a nie z metody zwiekszX (czyli 1). Oczywiscie analogiczna sytuacja z metoda int dajY()

Slawek

Tworzymy obiekt punkt (new Punkt()), x=0, y=0 (wartości typów prostych są automatycznie inicjowane takimi wartościami).
Wywołujemy metody zwiekszX() i zwiekszY(), zmienne W OBIEKCIE, który utworzyliśmy na początku zostają zmienione na x=1, y=1.
Wywołujemy zmienX(10), więc x=x+10, a ponieważ przed chwilą zwiększył się na 1 to ostatecznie x=11.
Metoda dajX() zwraca wartość x, który znajduje się w obiekcie, więc 11, nie jest tutaj zwracany wynik żadnej z metod zwiekszX(), ani zmienX(), tylko wartość zmiennej x.

Ragas

Jak widać w kodzie najpierw wywołuje metodę zwiekszX, co zwiększa w klasie Punkt wartość x na 1. Następnie wywołana zostaje metoda zmienX, która do x = 1 dodaje 10. Tak więc składowa x ostatecznie ma wartość 11, co wyświetla metoda dajX().

Arkadiusz

Takie proste a ja nie mogłem tego sam napisać, zacząłem ale zabrałem się do tego źle....
i dostawałem takie błędy

Cannot make a static reference to the non-static method zwieksz(Punkt) from the type Punkt

snt.banzai

a ja po prostu skasowałem static przed nazwą metody :D

uLu

Witam

trafiłem na ten sam problem
udało mi się go 'obejść' deklarując funkcję zwieksz(Punkt) jako
static int zwieksz(Punkt pkt)

andrew

Witam.
1)Czy metody zmien, nie powinny być wywoływane tak jak w rozdziale "argumenty metody", czyli "obiekt jako argument metody":
static void zmien(Punkt pkt){
pkt.x++;
pkt.y++;
}

Tutaj robisz to punkt.zwiekszY(); .
2) nurtuje mnie wyłołanie metody punkt.dajY(), Jeśli wywołam ją jak inne, to program nic nie zwraca. Prawidłowy zapis to :
System.out.println(punkt.zwiekszY());

Może mi ktoś to wyjaśnić. Dzieki.
Pozdrawiam

Marcin

metody dajX(), czy dajY() to tak zwane gettery. Pozwalają nam na dostęp do prywatnych pól klasy. Pola klasy powinno się ukrywać, ponieważ tak jest bezpieczniej, a użytkownikowi dawać możliwość modyfikowania składowych tylko przez metody dostępowe. Więc, aby wyświetlić dane trzeba zrobić dokładnie tak jak napisałeś.
W rozdziale "argumenty metod" było pokazane jak zmienić pola klasy przekazując obiekt do metody w innym obiekcie (tam przekazywany był obiekt Punkt do obiektu Test, w którym zmienialiśmy pola Punktu). Tutaj wszystko dzieje się w obrębie obiektu klasy Punkt - nie potrzebujemy modyfikować danych gdzieś na zewnątrz. W lekcji o argumentach metod chodziło raczej o to, żeby pokazać w jaki sposób modyfikować składowe klasy, gdy jej instancję przekażemy gdzieś na zewnątrz. (dosyć zawile mi to wyszło :) )

MarcinX

Hej,
Ja z kolei nie bardzo rozumiem o co chodzi z tym słowem kluczowym RETURN. Czy na przykład nie mógłbym po prostu zamiast
int wartosc = punkt.dajX(); (pobiera z klasy Punkt zwróconą wartość x), napisać w ten sposób:
int wartosc = punkt.x;
? Jaka jest różnica w tym? Po kompilacji mam taki sam wynik przy wydruku.
Bardzo dobry kurs uczę się na nim języka od podstaw!

jwyerzy

Gdyby zmienna x była zadeklarowana jako prywatna (int private x=0), to nie mógłbyś otrzymać jej wartości tak jak przedstawiłeś - int wartosc=punkt.x. Ta zmienna nie byłaby widoczna poza klasą w której została zadeklarowana.

Aloneman

Witam, kurs wspaniale napisany! Jeszcze nikt nigdy mi tak nie wytlumaczyl zadnego jezy ka programowania, dziekuje.

Janosch

Popieram! Świetny kurs, teraz uczę się tego języka z przyjemnością! Sławku, może jeszcze jakieś inne kursy przygotujesz, które przydałyby się do JAVY? Jakieś połączenia z SQL lub coś tego typu :)

Sławek Ludwiczak

Pracujemy nad nową odsłoną kursu, część będzie zamknięta i wprowadzimy niewielkie płatności, jednak wersja darmowa również będzie systematycznie wzbogacana. Potrzebujemy jednak na to jeszcze trochę czasu. Pozdrawiam, i dzięki za dobre słowo!

Adrian

Kurcze, niby prosty przykład ale na nim się wyłożyłem a to przez to że w błąd prowadził mnie tekst z zadania:
"- zmieniają wybraną zmienną o dowolną wartość" - ja to odebrałem tak że zmieniam wartość albo dla liczby X albo liczby Y a nie że obie naraz.

Arratres

Ja zrozumiałem to w ten sposób, że jedna metoda ma zmieniać jedną wybraną z dwóch zmienną (tym bardziej, że dalej jest zaznaczone, że mają być dwie osobne metody dla wyświetlania), ale poradziłem sobie z tym i moja klasa Punkt wygląda tak:

public class Punkt {

int wspX;
int wspY;


void zwieksz(String wybor){
if(wybor.equals("wspX")){
wspX++;
}
else if(wybor.equals("wspY")){
wspY++;
}
else{
System.out.println("Jako argument podaj wspX lub wspY");
}
}
void zwiekszWartosc(String a, int b){
if(a.equals("wspX")){
wspX += b;
}
else if(a.equals("wspY")){
wspY += b;
}
else{
System.out.println("Jako piewszy argument podaj wspX lub wspY");
}
}

public int zwrocX(){
return wspX;
}

public int zwrocY(){
return wspY;
}

void wspolrzedne(){
System.out.println("Współrzędne mają wartość ("+wspX+","+wspY+")");
}

}

Arratres

Damn, za późno zauważyłem "Komentarze z kodem powyżej 5 linii wklejamy tylko na Forum" :/

Adrian

moze źle to napisałem chodziło mi o to:
punkt.zwieksz(x); //czyli podaje co chce zwiększyć
punkt.zmien(x, o_wartosc_10); // podaje ktora zmienną chce zmienić i o jaką wartość

k2marko

Hej, napisałem ten program trochę inaczej. Nie wiem jednak czy nie jest zbyt prosty. Na pierwszy rzut oka wszystko funkcjonuje bardzo dobrze. Czy poprawne jest użycie w tym przypadku zamiast typów void typów int dla metod w których dokonuję inkrementacji? Czy mogę zainicjować zmienne odpowiadające za współrzędne już w klasie Punkt? Będę bardzo wdzięczny za każdą sugestię. Poniżej podaje swój kod:

public class Punkt {
int x=4;
int y=5;

int metoda1(){
return ++x;
}
int metoda2(){
return y-=3;
}
int metoda3(){
return x;
}
int metoda4(){
return y;
}
void metoda5(){
System.out.println("Współrzędne to: "+x+" oraz "+y);
}
}

public class PunktMain {
public static void main(String[] args) {
Punkt punkt = new Punkt();

System.out.println(punkt.metoda1());
System.out.println(punkt.metoda2());
System.out.println("Pierwsza współrzędna to: "+punkt.metoda3());
System.out.println("Druga współrzędna to: "+punkt.metoda4());
punkt.metoda5();
}
}

Janosch

A tutaj moje wypociny.
http://forum.javastart.pl/Thread-Argumenty-metod?pid=994#pid994