Zadanie🔗
Utwórz klasę Punkt, która przechowuje dwie wartości typu int - współrzędne punktu na powierzchni. Napisz w niej także metody które:
- zwiększają wybraną współrzędną o 1
- zmieniają wybraną zmienną o dowolną wartość
- zwracają wartość współrzędnych (oddzielne metody)
- wyświetla wartość współrzędnych
Napisz także klasę, w której przetestujesz działanie metod wyświetlając działanie metod na ekranie,
Rozwiązanie🔗
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 do artykułu
Wyłączyliśmy możliwość dodawania komentarzy. Poniżej znajdziesz archiwalne wpisy z czasów gdy strona była jeszcze hobbystycznym blogiem. Zapraszamy natomiast do zadawnia pytań i dyskusji na naszej grupe na facebooku.
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()
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.
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().
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
a ja po prostu skasowałem static przed nazwą metody :D
Witam trafiłem na ten sam problem udało mi się go 'obejść' deklarując funkcję zwieksz(Punkt) jako static int zwieksz(Punkt pkt)
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 topunkt.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. Pozdrawiammetody 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 :) )
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!
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.
Witam, kurs wspaniale napisany! Jeszcze nikt nigdy mi tak nie wytlumaczyl zadnego jezy ka programowania, dziekuje.
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 :)
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!
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.
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+")"); } }
Damn, za późno zauważyłem "Komentarze z kodem powyżej 5 linii wklejamy tylko na Forum" :/
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ść
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(); } }
A tutaj moje wypociny. http://forum.javastart.pl/Thread-Argumenty-metod?pid=994#pid994