Void

Thisor

Bekanntes Mitglied
Hey,

void sagt ja, dass die Methode keinen Rückgabewert hat.
Allerdings kann ich ja eine Methode wie folgt schreiben:
Code:
public main-Methode{
Bruch b = new Bruch();
b.zaehler = 3;
b.nenner = 4;
b.ausgeben();

class Bruch{
int zaehler;
int nenner;

void ausgeben(){
Syso(zaehler + nenner);

Dadurch hat ja void doch einen Rückgabewert, zumindest wird Syso ja ausgeführt. Wie genau habe ich das zu verstehen, dass void keinen Rückgabewert hat? Hat Sysoprint nichts mit Rückgabewert zu tun? Und Rückgabewert bedeutet soviel wie in die MainMethode was zurück zu geben?
 

InfectedBytes

Top Contributor
es hat nichts mit rückgabe zu tun. System.out.println gibt einfach nur text aus.
Beispiel:
Java:
public static int max(int a, int b) {
  if(a>b) return a;
  return b;
}
Mit return gibst du einen Wert zurück, ob du nun per println text ausgibst oder nichts, hat ja nichts mit der Rückgabe zu tun.
Java:
int m = max(1,2);
die Variable m erhält nun den Wert, welcher von der max-Methode zurückgegeben wird.
 

Thisor

Bekanntes Mitglied
Okay, soweit versteh ichs, aber nicht so ganz mit System.out.println wieso der nur text ausgibt.

Ich kann ja auch
Code:
int a = 2;
int b = 2;
println(a+b);
und bekomme dann 4 raus und nicht 22.
Und ich kann ja auch eine Methode schreiben die einen Rückgabentyp String haben soll und da gebe ich ja text und nicht ein Wert zurück.
 

InfectedBytes

Top Contributor
a+b ist 4, und dann wird der text 4 ausgegeben.
Und natürlich kannst du einen String zurückgegeben, aber dort wird auch nur ein Wert zurückgegeben. In dem Fall ist der Wert die String Referenz (da String ein objekt ist)

println gibt einfach nur Sachen auf der Konsole aus. Egal ob Zahlen, Strings, etc.

Der Rückgabewert ist eben genau das, was mit return zurückgegeben wird.
 

Thisor

Bekanntes Mitglied
Zur Verständnis:
Hier zum Beispiel bei der voidMethode, da sie keinen Rückgabewert hat, muss ich dann im Methodenaufruf einen Wert hineingeben, damit sie arbeitet? also in dem Fall:
Code:
mainMethode{
Bruch b = new Bruch();
b.zaehler = 3;
b.nenner = 4;

b.ausgeben(2);//Methodenaufruf

void ausgeben(){
zaehler *=a;
nenner *= a;
         }
}

Edit:
Der Sprachlicher Gebrauch würde dann heißen, ich übergebe den Wert 2 an die Methode ausgeben? Oo
Ausgabe wäre dann 6 und 8?
 

JStein52

Top Contributor
An die Methode ausgeben kannst du gar nichts übergeben weils sie keinen Parameter hat. Dein Beispiel ist so gar nicht kompilierbar.
 
K

kneitzel

Gast
Also ob Du einen Wert in eine Methode übergibst oder nicht ist unabhängig davon, ob eine Methode etwas zurück gibt oder nicht.

Bei Code würde ich Dir auch raten, dass Du Code aus einem Editor kopierst so dass Du relativ sicher bist, dass er kompiliert werden kann und dann am Besten auch ganze Klassen posten.
Deine Methode ausgeben nimmt derzeit keinen Parameter, aber vermutlich sollte das a der Parameter sein.
Die Namen sollten aussagekräftig sein. Deine Methode ausgeben gibt ja nichts aus. Statt dessen wird etwas multipliziert. Und a wäre dann ggf. der Multiplikator.

Generell brauchst Du einen Rückgabetyp, wenn Du irgend welche Daten zurück geben willst. Das kann alles Mögliche sein. Also z.B. das Ergebnis einer Suche oder so. Beispiele für Deine Bruch Klasse könnten sein, dass Du z.B. getZaehler und getNenner als Methoden schreibst um auf zaehler und nenner zuzugreifen.

Wenn Du möchtest, könntest Du eine Methode multiplizieren schreiben, die den eigentlichen Bruch nicht verändert sondern das Ergebnis zurück gibt. Das könnte dann z.B. der folgende Code sein:

Code:
public Bruch multilizieren(Brunch multiplikator) {
   Bruch ergebnis = new Bruch();
   ergebnis.zaehler = zaehler * multiplikatior.zaehler;
   ergebnis.nenner = nenner * multiplikator.nenner;
   return ergebnis;
}

Konrad
 

Thisor

Bekanntes Mitglied
Oh hm, okay. Dann anders :
Code:
public class EinfachMalSo {

    int zaehler;
    int nenner;

    public static void main(String[] args) {

        int a ;
        EinfachMalSo b = new EinfachMalSo();
        b.zaehler = 3;
        b.nenner = 4;
        System.out.println(b.ausgeben(2));
    }
    void ausgeben(int a){
      
        zaehler *= a;
        nenner *= a;
    }

}
dann eher so?
seh aber gerade das ich es nicht testen kann, die Fehlermeldung kommt bei println kommt :
The method println(boolean) in the type PrintStream is not applicable for the argument(void)

Edit: oh da wart ihr schneller, gibt jetzt essen, melde mich anschließend wieder ^_^
 

JStein52

Top Contributor
Ja klar geht das nicht zu kompilieren weil ausgeben(int a) nichts zurückgibt ! Was wolltest du denn dass es zurückgibt ?
 
K

kneitzel

Gast
Also ich versuche mal eine Erklärung. Wir vermenschlichen einfach einmal alles. Diese Instanzen sind jetzt alles Menschen, die gewisse Dinge können.
Also wenn Du Herr Meier Geld gibst, dann steckt er es einfach ein. Das ist dann eine Methode GeldGeben. Übergeben wird Geld. Zurück gegeben wird nichts. Statt dessen landet das Geld in der Geldbörse.

Du kannst Herr Schmidt um Geld bitten, der ist dann nett und gibt Dir Geld. Und zwar immer einen Hunderter. Echt geil dieser Herr Schmidt.

Also kannst Du sowas machen:
Meier.GeldGeben(Schmidt.UmGeldBitten());
Schmidts UmGeldBitten() gibt 100 Euro zurück und diese landen dann in der Geldbörse von Meier.

Wenn Du aber nun Meier.GeldGeben() machst, dann wird Hr. Meier Dich nicht verstehen. Wenn GeldGeben, dann muss da auch das Geld kommen. Leer kann es nicht bleiben!

Nun zurück zu Deinem Code: System.out.println musst Du übergeben, was es dann schreiben soll. Dein b.ausgeben(2) gibt aber nichts zurück (= vom Typ void). Und das ist dann wie der Hr. Meier, dem Du sagst GeldGeben ihm aber kein Geld gibst.

Konrad
 

Thisor

Bekanntes Mitglied
Sorry, ich versteh´s nicht..
Halten wir kurz mal was fest:
- void hat keinen Rückgabewert.
jetzt hier das Programm dazu:
Code:
public class Bruch {

   int zaehler;
   int nenner;

   public static void main(String[] args) {

     int erweiternMit = 2;
     Bruch b = new Bruch();
     b.zaehler = 3;
     b.nenner = 4;
     System.out.println(b.erweiter(erweiternMit));
   }

   void erweiter(int erweiternMit) {

     zaehler *= erweiternMit;
     nenner *= erweiternMit;
   }

}
das heißt dann quasi ich kann die Methode nicht aufrufen, bzw sie gibt halt nichts, ob mit oder ohne Parameter?
Nicht mal in der MainMethode aufrufen? Sie gibt ja keinen Wert zurück..
 

thecain

Top Contributor
deswegen sind die instanzvariablen von b trotzdem verändert worden.

probier deine beispiele doch aus, dann merkst du das auch schnell selber...
 

JStein52

Top Contributor
Kann er nicht ausprobieren weil es gar nicht kompiliert. erweiter ist vom typ void !

Obwohl, das ist auch ein ausprobieren :):)
 

Thisor

Bekanntes Mitglied
ich hab
Code:
int erweiternMit = 2;
//und hab die Methode:
void erweiter(int erweiternMit) {

        zaehler *= erweiternMit;
        nenner *= erweiternMit;
da wird ja was berechnet, und zwar
zaehler * 2 //erweiternMit
und nenner * 2
also habe ich jetzt erwartet dass ich die Methode mir 6 und 8 ausliefert
 

Thisor

Bekanntes Mitglied
Ich weiß es nicht, syso in void eingeben..
edit:
Ich geb ja aber so nichts zurück, dachte mit void kann ich nichts zurückgeben
 
K

kneitzel

Gast
Also deine erweitern Methode liefert nichts zurück, daher hat es keinen Sinn, diese Methode an einer Stelle zu nutzen, an der ein Parameter erwartet wird.

Was also sinn macht, ist etwas wie:
meinBruch.erweitern(2);
System.out.println(meinBruch);

Oder man überlegt sich eine andere Strategie. Eine Möglichkeit wäre, dass man sich z.B. überlegt, dass Brüche selbst nicht verändert werden. Dann würde das bedeuten, dass die Methode erweitern nicht die eigene Instanz verändert sondern eine neue Instanz schafft, welche dann zurück gegeben wird:
Code:
public Bruch erweitern (int erweiternMit) {
  Bruch ergebnis = new Bruch();
  ergebnis.zaehler *= erweiternMit;
  ergebnis.nenner *= erweiternMit;
  return ergebnis;
}

Oder man definiert, dass diese Methoden generell die eigene Instanz zurück geben. Dann wäre die Implementation z.B.:
Code:
public Bruch erweitern (int erweiternMit) {
  zaehler *= erweiternMit;
  nenner *= erweiternMit;
  return this;
}
Dies würde die Möglichkeit schaffen, dass man dann viele Aufrufe aneinander reihen kann:
meineInstanz.func1().func2().func3().func4().func5().func6();

Aber das sind beides zwei besondere Implementationen, die nicht wirklich üblich sind. Gerade letzteres führt in meinen Augen zu schwer lesbarem Code.

Was ich nicht verstehe ist, wieso Du da Aufrufe verschachteln willst. Wieso nicht einfach zwei getrennte Aufrufe? Einmal das Erweitern und dann die Ausgabe?

Konrad
 

thecain

Top Contributor

Thisor

Bekanntes Mitglied
Also deine erweitern Methode liefert nichts zurück, daher hat es keinen Sinn, diese Methode an einer Stelle zu nutzen, an der ein Parameter erwartet wird.

Was also sinn macht, ist etwas wie:
meinBruch.erweitern(2);
System.out.println(meinBruch);
Okay!
War eine Aufgabe aus nem Buch, die so vorgegeben war, aus dem Kapitel void, sonst hätte ich vermutlich mit return gearbeitet.

@thecain : lese ich mir nebenbei auch durch, aber in der praxis kommen immer wieder fragen auf oder gelingt eben nicht beim ersten mal.
Verstehe zum Beispiel immer noch nicht ganz so den Sinn wieso überhaupt mit void-Methoden zu arbeiten.
 

InfectedBytes

Top Contributor
println selbst ist z.b. eine void methode.
Sie macht nichts anderes als irgendwas in die Konsole zu schreiben.
Warum sollte sie also was zurückgeben?

void methoden nutzt du eben wenn es keinen Sinn macht etwas zurückzugeben.
 

Thisor

Bekanntes Mitglied
Das wusste ich noch gar nicht :)
Hmm also die Aufgabe war ja in einem Buch, und wenn ich den Bruch erweitere, aber nicht weiß welchen Wert sie danach hat, oder mich das gar nicht kümmert... wieso erstelle ich sie dann?
 
K

kneitzel

Gast
Beim Aufruf der Methode erweitern wird doch die Instanz selbst verändert. Somit weisst Du den den Wert danach! Schreib eine Methode Ausgabe oder toString und dann sorg dafür, dass die Werte ausgegeben werden. Oder besser: Benutz einen Debugger! Dann siehst Du das Verhalten und verstehst es evtl. besser.

Konrad
 

Thisor

Bekanntes Mitglied
Habe ich bereits gemacht *höhö*
Ich dachte mir nur, wenn ich gleich eine Methode schreibe mit einem Rückgabewert, dann kann ich sie doch aufrufen wenn erwünscht und wenn nicht dann lass ich´s gut sein.
Aber wenn ich jetzt n Schritt weiter denke, dass ich mit Objekten arbeiten würde mit Attributen etc (ja, Bruch ist auch ein Objekt, vllt ist dies kein guter Beispiel für mich gewesen), macht das ganze aber schon mehr Sinn.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Kann mir jemand sagen warum public void unzulässig ist? Java Basics - Anfänger-Themen 2
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
V Methoden printChar Methode mit Rückgabetyp void Java Basics - Anfänger-Themen 26
M Wie kann eine Methode (string) eine andere Methode (void) mit zufälligen int-Werten aufrufen? Java Basics - Anfänger-Themen 4
S Methoden - Warum int wenn auch void? Java Basics - Anfänger-Themen 3
NaZuRe Geld(Wert) von der public static void main in die public static void Blackjack Java Basics - Anfänger-Themen 2
N Groß- und Kleinschreibung bei Java: void Methode Java Basics - Anfänger-Themen 1
Vamecruft Compiler-Fehler public static void zu static String ändern Java Basics - Anfänger-Themen 2
bensdt Klasse erweitern um eine Methode "void decrement()" Java Basics - Anfänger-Themen 5
C Methoden Unterschied zwichen public int, public static int und public static void Java Basics - Anfänger-Themen 2
J Frage zu: public static void main (String[]args) Java Basics - Anfänger-Themen 1
MrDramasetter Rückgabetyp Void oder Sting Java Basics - Anfänger-Themen 18
C Void Methode überladen Java Basics - Anfänger-Themen 5
V for-Schleife in einer void Methode Java Basics - Anfänger-Themen 3
L [Verständnisproblem] Array wird trotz void rückgabe verändert. Java Basics - Anfänger-Themen 5
Tommy Nightmare void Methode gibt Array zurück Java Basics - Anfänger-Themen 3
I Methoden public void paintComponent (Graphics g) Java Basics - Anfänger-Themen 4
shiroX Methoden JUnit-Test einer void-Methode Java Basics - Anfänger-Themen 4
H Variablen Void und der Rückgabewert Java Basics - Anfänger-Themen 6
G Interpreter-Fehler Problem mit void-Methoden Java Basics - Anfänger-Themen 2
Silvascus Void Methode einem Stringparameter im syso-Befehl hinzufügen Java Basics - Anfänger-Themen 3
L Was genau macht "public static void" ? Java Basics - Anfänger-Themen 12
B ja ja schon wieder einer mit einer public static void main(string[] args) Frage... Java Basics - Anfänger-Themen 8
W Klassen Fehler bei public void setLabelText(JLabel label, String text) Java Basics - Anfänger-Themen 11
Y Warum void statt Datentyp + return Java Basics - Anfänger-Themen 4
T Java Code Hilfe - public void xxx() Java Basics - Anfänger-Themen 2
T public void - Problem Java Basics - Anfänger-Themen 10
M Methoden void verschachteln Java Basics - Anfänger-Themen 4
B Void Mehoden Testen Java Basics - Anfänger-Themen 13
S Methoden void-Methode: Wieso gibt es eine Rückgabe? Java Basics - Anfänger-Themen 5
R public static void Rückgabe Java Basics - Anfänger-Themen 5
P Compiler-Fehler public static void main, Grundloses Problem Java Basics - Anfänger-Themen 4
S Static void Methode Java Basics - Anfänger-Themen 12
L Objekte aus einem void in anderen voids verwenden Java Basics - Anfänger-Themen 8
K GUI Button methoden/void Problem Java Basics - Anfänger-Themen 6
S Probleme mit dem rückgabetyp void Java Basics - Anfänger-Themen 8
D Array void Methode erstellen. Java Basics - Anfänger-Themen 12
E Methoden public static void main(String[] args) Java Basics - Anfänger-Themen 9
I Methoden Problem If/Else; Public Void Java Basics - Anfänger-Themen 6
D Compiler-Fehler void is an invalid type for the variable Java Basics - Anfänger-Themen 5
B Geerbte Instanz kann keine void Methode ausführen?! Java Basics - Anfänger-Themen 15
M Fragen zu Methoden (void/return), Übergabe von Parametern Java Basics - Anfänger-Themen 3
S Datentypen float statt void Java Basics - Anfänger-Themen 3
S Static void main <-> componentListener Java Basics - Anfänger-Themen 9
O Probleme mit void java.awt.Component.setBackground(Color c) Java Basics - Anfänger-Themen 2
T Hilfe bei void, int !? Java Basics - Anfänger-Themen 14
U void shift Java Basics - Anfänger-Themen 7
T Geht so was? public void verkaufe (<X implements Produkt& Java Basics - Anfänger-Themen 8
D generische methode <T> void . Java Basics - Anfänger-Themen 9
C public static void main(String[] args) Java Basics - Anfänger-Themen 6
D Frage zu public static void main. Java Basics - Anfänger-Themen 4
K void Methode abbrechen Java Basics - Anfänger-Themen 7
G Vor oder hinter public static void main. ? Java Basics - Anfänger-Themen 8
M 'void' type not allowed Java Basics - Anfänger-Themen 18
T rotes herz public void paint(Graphics g) Java Basics - Anfänger-Themen 2
G Was ist public static void main(String[] args)? Java Basics - Anfänger-Themen 12
G <identifier> expected bei public void final Java Basics - Anfänger-Themen 3
H void not allowed? Java Basics - Anfänger-Themen 4
P Void-Aufrufe verursachen IO-Exceptions? Java Basics - Anfänger-Themen 4
T Von Main auf eine Variable in void zugreifen Java Basics - Anfänger-Themen 4
C public void keyPressed(KeyEvent e) Java Basics - Anfänger-Themen 2
N public void und verhalten bei return Java Basics - Anfänger-Themen 2
M public static void main(String... args)<- Was bedeutet das? Java Basics - Anfänger-Themen 5
A die public static void main ? Java Basics - Anfänger-Themen 3
C Java-Anfang main void public? Java Basics - Anfänger-Themen 5
N public static void main(String args[]) Java Basics - Anfänger-Themen 6
G Warum eigentlich static void? Java Basics - Anfänger-Themen 3
T void Methode -> keine Chance Java Basics - Anfänger-Themen 6
F public final void getsignature() | anfänger Java Basics - Anfänger-Themen 7
B Problem mit einer static void Methode Java Basics - Anfänger-Themen 8
P Was genau bedeutet "public static void main(String[] ar Java Basics - Anfänger-Themen 10
R void? static? beide? garnichtst von beiden? Java Basics - Anfänger-Themen 11
B Eine void innerhalb einer anderen void Java Basics - Anfänger-Themen 7
G in void verändern Java Basics - Anfänger-Themen 5
J public static void main? Java Basics - Anfänger-Themen 5
G public static void main(final String[] args) Java Basics - Anfänger-Themen 4
N public static void Java Basics - Anfänger-Themen 18
X Was genau heißt "public static void main(String[] args) Java Basics - Anfänger-Themen 4
B public static void main (String[] args) ??? Java Basics - Anfänger-Themen 2
G getParameter in public static void main Java Basics - Anfänger-Themen 3

Ähnliche Java Themen


Oben