Wątek zablokowany 2016-09-01 16:35 przez somekind.

Wątek przeniesiony 2016-08-31 17:31 z Java przez ŁF.

Po co sa metody inne niz void

0

Hej , jestem poczatkujacy , tak jak w temacie
po co w uzywac innej metody niz void? po co ten return ? np,

public static void dodawanie(int a, int b)
{
int res = a+b; System.out.println(res);
}

a w metodzie main np dodawanie (1,3) ;
po co zamieniac np voida na int i return a+b , wyjdzie to saamo co w void , oco chodzi z tym zwracaniem
bardzo prosze o pomoc

5

Ty tak poważnie? A wiesz że czasem chcesz zrobić z wartością cos wiecej niż tylko ja wypisać? Fajnie byloby móc ja sobie gdzieś zapisać. Co prawda niby mógłbyś to zasymulować poprzez przekazanie do metody obiektu na zwracaną wartość, ale to juz lekka przesada i w zasadzie taka ułomna proteza na standardowy mechanizm zwracania wartości.
Ćwiczenie dla ciebie:

  • napisz funkcje która pobiera jedną liczbę int
  • napisz kolejną funkcje która dodaje kilka liczb pobranych tą pierwszą funkcją.
1

@Ro3ert: jak Ci nie pasuje Java która wymaga return, to zainteresuj się Clojure lub Groovy.

3

@Ro3ert w funkcji zwracającej void również możesz użyć return.

1

Może to pomoże w zrozumieniu po co się przydaje return. ;P
http://martinfowler.com/bliki/CommandQuerySeparation.html

2

Załóżmy, że chcesz napisać prosty program, który wczyta liczbę i wypisze sinus tej liczby. Funkcja do wyliczenia sinusa już istnieje, więc kod jest prosty

Scanner scanner = new Scanner(System.in);
double number = scanner.nextDouble();
		
double sin = Math.sin(number);
System.out.println("sin of " + number + " is " + sin);

Teraz pomyśl o funkcji Math.sin(), przecież ona musi zwrócić wynik, żebyś mógł jej używać w ten sposób. Koncepcyjnie wygląda mniej więcej tak:

static double sin(double inputNumber) {
    double result;
    ...
    return result;
}

Gdyby nic nie zwróciła to byłaby zupełnie bezużyteczna, bo niby jak masz jej używać? Nie możesz modyfikować jej kodu żeby dodać swoje System.out.println(), już nie mówiąc o tym że wyniku możesz potrzebować do wielu innych rzeczy a nie tylko wypisywania.

2

Ten temat to jest perełka.

1

niektórzy użytkownicy dają sobie upust, choć nie wiem czemu...
Najprostsza odpowiedź to taka: bo tak jest i już. Tak został zbudowany język, żeby można było wykorzystywać zarówno void jak i return.
void wpisujesz w metodzie, kiedy nie chcesz, żeby zwracała wartość, tj. Shalom w komentarzu wyżej.
return podajesz w metodzie, jak Twoja metoda coś zwraca. Przykładowo:

public double dodawanie(double a, double b) {
        return a + b;
    } 

ta metoda zwróci sumę dwóch liczb zmiennoprzecinkowych; liczba zwrócona też jest zmiennoprzecinkowa.

public double dodawanie(int a, int b) {
        return a + b;
    } 

Powyższa metoda też zwróci sumę, ale liczby jakie podajemy w parametrze metody to są liczby całkowite, a zwrócona zostanie liczba zmiennoprzecinkowa

public double dodawanie(String a, double b) {
        return a + b;
    } 

Powyższa metoda wywali błąd, bo chcę aby metoda zwróciła double, ale w parametrach przekazuję String i double. Czyli nasz return będzie chciał zwrócić String. Dlaczego String? Ano dlatego, że Javie jak dodajemy jakąkolwiek liczbę do String za pomocą znaku "+", to liczba jest traktowana jak String.

Poza tym pisząc swoje metody niekoniecznie chcę zwracać tylko typy proste. Chcę np. inny obiekt klasy. Przykładowo ten sam kod:

public String dodawanie(String a, String b) {
        return a + " " +  b;
    } 

Podaje 2 Stringi i z powrotem mam 2 wyrazy, które podałem, ale oddzielone spacją. Zwrócony zostanie obiekt String.

To tyle...

1

Moim zdaniem pytanie ma duży potencjał, z którego autor może nie zdaje sobie nawet sprawy, właśnie za sprawą programowania funkcyjnego.

2
abc(2,4) + abc(3,1)

Żeby móc dodawać, trzeba mieć co. A void oznacza, że abc(2,4) niczego nie zwraca, więc to wyrażenie nie daje żadnej liczby, nic. Nie ma czegoś takiego jak zmienna void.
Żeby to wyrażenie oznaczało jakąś liczbę, to funkcja musi właśnie coś zwrócić.

0

Po co w ogóle są metody? Przecież wszystko można zrobić za pomocą if i goto...

0
class rozne
{
	
	public static void main(String[] args)
	{
		//abc(2)+abc(3);-- blad
			System.out.println(cba(2)+cba(3));
	
  }
   
   public static void abc(int x)
   {
	   
	   System.out.println(x);
   }
   
   public static int cba(int x)
   {
	   x++;
	   return x;
   }
}

chodzilo mi ocos takiego , w voidzie nie da rady dodawac , a jak return jest mozna , oto chodzi w tym? po to ten return? ze mozna operacje wykonywac wewnatrz maina uzywajac metod z returnem ?

1

Jako ciekawostkę można podać, że w języku Pascal istnieje rozdział na funkcje, które zwracają wartość, i na takie, które wartości nie zwracają. Te drugie zwane są w Pascalu procedurami. Więc jeśli tutaj masz jako void, to w Pascalu byś miał procedurę. Tam gdzie masz int, w Pascalu miałbyś funkcję.

O ile wydaje mi się bez sensu taki podział na dłuższą metę, to myślę, że dla celów edukacyjnych (a w końcu Pascal to język po części edukacyjny) ma to jakiś sens. Łatwiej można zobaczyć różnicę.

1
Ro3ert napisał(a):

chodzilo mi ocos takiego , w voidzie nie da rady dodawac , a jak return jest mozna , oto chodzi w tym? po to ten return? ze mozna operacje wykonywac wewnatrz maina uzywajac metod z returnem ?

Tak. Powtarzam się, ale: jeśli chcesz operować (w tym przypadku dodawać) na jakiejś wartości wyliczonej w funkcji, no to najpierw musisz tę wartość zwrócić.

1

Temat Zamkniety

1
Ro3ert napisał(a):
class rozne
{
	
	public static void main(String[] args)
	{
		//abc(2)+abc(3);-- blad
			System.out.println(cba(2)+cba(3));
	
  }
   
   public static void abc(int x)
   {
	   
	   System.out.println(x);
   }
   
   public static int cba(int x)
   {
	   x++;
	   return x;
   }
}

chodzilo mi ocos takiego , w voidzie nie da rady dodawac , a jak return jest mozna , oto chodzi w tym? po to ten return? ze mozna operacje wykonywac wewnatrz maina uzywajac metod z returnem ?

Korzystaj z konwencji programowania w Javie, czyli:

  • nazwa klasy z wielkiej litery;
  • nazwa metody i zmiennych z małej litery, i dalej "camelCase" np.
public class MyFancyClass{
	//zmienne
	int myFancyVariable;

	//metoda
	public void myFancyMethod(int myFancyVariable){

		myFancyVariable++;
		System.out.println(myFancyVariable);

	}
}
  • w "psvm" (public static void main) nie powinno się umieszczać logiki programu, tylko "wywołać" klasę główną (w zasadzie stworzyć obiekt klasy), która tą logikę posiada:
public class Main {
	public static void main(String[] argv){

		MyFancyClass mfc = new MyFancyClass();
		mfc.myFancyMethod(2);

	}
}
  • nazwy metod powinny być po angielsku i nazwa powinna mieć znaczenie, czyli:
public void printStringToScreen(String myString) {
	System.out.println(myString);
}

Powyższy kod jest bezmyślny, ale chodzi o to, żeby pokazać jak ma nie wyglądać:

public void abcd(String olaboga){
	System
		.out
		.println(olaboga);
}

Jedno i drugie spełnia tą samą funkcję, ale pierwsze jest bardziej czytelne dla innych :)

W voidzie da radę dodawać, ale tego nie zrobiłeś. Wywołałeś metodę println() klasy System. Jakbyś napisał

System.out.println(x + 1);

to byś dodał ;)
Po prostu: w voidzie wywołałeś klasę "wbudowaną" w Javie, której zadaniem jest wypisanie zadanej w parametrze wartości do konsoli.

Ja przyjmuję taką zasadę jeśli chodzi o void i return. Jeśli metoda ma coś zwracać np. typ prosty, obiekt - to przed nazwą metody piszę to co chcę zwrócić, a w ciele metody (czyli tego co znajduje się między nawiasami { }) piszę return z "rzeczą", którą chcę zwrócić.
Jeśli metoda ma nic nie zwracać, to przed nazwą jest void, a w ciele nie ma return.

To Ci powinno wystarczyć na początek.

Zresztą wszystkie IDE pilnują tego, gdy jak masz metodę, która ma coś zwracać, faktycznie coś zwraca. Na upartego można coś takiego napisać, ale kompilator wywali błąd.

Początki są trudne. :)
Powodzenia.

1

a nie jest tak, że @Ro3ert myślał, że argument jest przekazywany przez referencję, a jest przekazywany przez wartość?

 public static int cba(int x)
   {
       x++;
       return x;
   }

jeśli dobrze rozumiem (w Javie mało programowałem i dawno, więc mogły mi ulecieć subtelności języka), to przy takim kodzie x++ zmieniamy tylko lokalną kopię argumentu, dlatego ten kod jest trochę bez sensu, bo robi (jeśli się nie mylę) to samo co to:

public static int cba(int x)
   {
       return x + 1;
   }

chodzilo mi ocos takiego , w voidzie nie da rady dodawac , a jak return jest mozna , oto chodzi w tym? po to ten return? ze mozna operacje wykonywac wewnatrz maina uzywajac metod z returnem ?

return jest do zwracania wartości (np. return x, return x + 1, return JAKIES TAM WYRAZENIE etc.), a nie do bycia metodą z returnem. Nie jest tak, że return wpływa wstecz na znak ++ (bo o to chyba pytałeś).

5

Ja może napiszę tak z innej beczki i zaznaczę że na początu nauki programowania warto wykazać trochę pokory i przyjąć zasadę "Wiem że nic nie wiem". Początkujący programiści często zapominają albo i nie wiedzą że to czego się uczą to jedynie mechanizmy, a sens używania tych mechanizmów przyjdzie z czasem. Przykład z wypisaniem do konsoli liczb- skupiasz się na bardzo małym kontekście zamiast skupiać się na mechanizmie który poznajesz. To może wydawać się nie mieć sensu ale uwierz że jak najbardziej ma i takie mechanizmy nie istnieją bez powodu. Po prostu z czasem to "zaskoczy" i sam sobie uświadomisz jakie to banalne.

Aż z łezką w oku przypomina mi się jak piewszy raz dowiedziałem się o metodach i dziwiłem się czemu wszystkiego nie pisać w main'nie :D Trochę dziwią mnie uszczypliwe odpowiedzi doświadczonych programistów. Przykro widzieć taki brak wyrozumiałości i również brak pokory- nam też ona jest potrzebna. Nie tylko początkującym. Nie zapominajcie jak to było kiedy sami się uczyliście podstaw podstaw.

0

Hej jeszczer , zastanawialem sie nad nowym watkiem ale to chyba znowu za glupie pytanie , tym razem odnosnie zadania
Dana jest nastepujaca tablica znaków:
char [ ] [ ] tab = {
{’S’ , ’a’ , ’m’ , ’s’ , ’u’ , ’n’ , ’g’ } ,
{’N’ , ’o’ , ’k’ , ’i’ , ’a’ } ,
{’A’ , ’p’ , ’p’ , ’l’ , ’e’ } ,
{’B’ , ’l’ , ’a’ , ’c’ , ’k’ , ’B’ , ’e’ , ’r’ , ’r’ , ’y’ } ,
{’A’ , ’l’ , ’c’ , ’a’ , ’t’ , ’e’ , ’l’ } ,
{’S’ , ’o’ , ’n’ , ’y’ } ,
{’J’ , ’o’ , ’l’ , ’l’ , ’a’}
} ;
Utwórz program sprawdzajacy, które z nazw umieszczonych w powyzszej tablicy:
zawieraja przynajmniej dwie takie same litery,
suma wszystkich znaków w słowie jest wieksza niz 255,
zawiera przynajmniej jeden znak ’i’,
zawiera przynajmniej dwa takie same znaki.
Nastepnie wypisz nazwy spełniajace przynajmniej 3 z powyzszych warunków.

jaka jest roznica miedzy : zawieraja przynajmniej dwie takie same litery, a zawiera przynajmniej dwa takie same znaki?

0
Ro3ert napisał(a):

jaka jest roznica miedzy : zawieraja przynajmniej dwie takie same litery, a zawiera przynajmniej dwa takie same znaki?

Jeżeli się nie mylę, to:

Litera jest znakiem, ale znak nie musi być literą

Przykładowe litery: ABCDEFQWEASCZXBVBNBVRTPYORTM
Przykładowe znaki: . | ! @ # $ % ^ & * ( ) :[]* \n \0

0

Być może autorowi chodzi o wielkość liter, wtedy tablica

{’S’ , ’a’ , ’m’ , ’s’ , ’u’ , ’n’ , ’g’ } 

zawiera dwie takie same litery (S i s) ale nie zawiera dwóch takich samych znaków.

1 użytkowników online, w tym zalogowanych: 0, gości: 1