Nicht-statische Methode aus statischer aufrufen

Aloha alle zusammen. Ich gurke schon seit stunden im Indernet umher, doch finde keine Richtige Lösung für mein Problem (oder bin grad einfach nur zu blöd dafür :slight_smile: )

Also (wundert euch nicht, wegen mangel an kreativität ist es Mensch vs. Monster :D) ich raffs grade nicht, wie ich aus der main eine nicht-statische methode aufrufen kann.

import java.util.Scanner;
import java.util.Random;


public class Kampf
{


    public static void main(String[] args)
    {
        kampf();
        
    }
    

    Random r = new Random();
    Scanner scanner = new Scanner(System.in);

    int angriffMensch, angriffMonster;
    String wahl;
    
    public void Mensch()
    {
        angriffMensch = r.nextInt();
    }

    public void Monster()
    {
        angriffMonster = r.nextInt();
    }
    
    
    void kampf()
    {
        System.out.print("Mensch oder Monster? ");
        wahl = scanner.next();

        if(wahl == "Mensch")
        {
            if(angriffMensch > angriffMonster)
            {
                System.out.println("Du hast gewonnen!");
            }else
            {
                System.out.println("Monster hat gewonnen!");
            }
        }else
        {
            if(angriffMonster > angriffMensch)
            {
                System.out.println("Du hast gewonnen!");
            }else
            {
                System.out.println("Mensch hat gewonnen!");
            }
        }
    }
}

Ich wäre euch sehr dankbar wenn mir das jemand erklären könnte :smiley:

Ups, ganz unten hab ich noch die } - Klammer vergessen.

Nicht das ihr denkt ich sei schusselig :smiley:

Hi das geht ganz einfach

public static void main(String[] args){
Kampf kamp = new Kampf();
kamp.kampf();
}

D.h. du legst einfach ein Objekt vom Typ Kampf an und dann kannst du darauf die Methode kampf, oder Mensch oder Monster aufrufen.
Ein Hinweis, schreib alle Methoden klein zum einen ist das so laut den Codingconventions von Sun “Vorgeschrieben” aber dann ist es auch einheitlich, weil kampf schreibst du klein und Mensch/Monster schreibst du groß.

Ah, mist. Ich hatte es fast richtig :frowning:

   [LEFT]   	[IMG]http://forum.byte-welt.net/images/bbcodemanager/light/code/06nc.png[/IMG] 	Java [[IMG]http://forum.byte-welt.de/images/misc/format_list_orderedygwn.png[/IMG]](javascript:toggleList(0);) 	[IMG]http://forum.byte-welt.net/images/bbcodemanager/light/code/12nc.png[/IMG]    	 		 		 		 			[IMG]http://forum.byte-welt.net/images/bbcodemanager/light/code/04nc.png[/IMG] 			
		[IMG]http://forum.byte-welt.net/images/bbcodemanager/light/code/05nc.png[/IMG] 		 		 			
		[LEFT][FONT=Courier New][FONT=monospace]

[ol]
[li][FONT=Courier New]Kampf kampf = new Kampf();[/li][li]Kampf.kampf();[/li][/ol]
[/FONT]
[/FONT][/LEFT]

	 		 			[IMG]http://forum.byte-welt.net/images/bbcodemanager/light/code/01nc.png[/IMG] 			
		[IMG]http://forum.byte-welt.net/images/bbcodemanager/light/code/03nc.png[/IMG] 		 		 		 	    [/FONT][/LEFT]

Da lag mein Fehler :frowning:

Aber jetzt ein anderes Problem:

Wenn ich es ausführe, kommt meine Auswahl, und wenn ich „Mensch“ eingebe, gibt es „Mensch hat gewonnen!“ aus. Aber das dürfe laut dem iF garnicht vorkommen denn:

   [LEFT]   	[IMG]http://forum.byte-welt.net/images/bbcodemanager/light/code/06nc.png[/IMG] 	Java  	[IMG]http://forum.byte-welt.net/images/bbcodemanager/light/code/12nc.png[/IMG]    	 		 		 		 			[IMG]http://forum.byte-welt.net/images/bbcodemanager/light/code/04nc.png[/IMG] 			
		[IMG]http://forum.byte-welt.net/images/bbcodemanager/light/code/05nc.png[/IMG] 		 		 			
		[LEFT][FONT=Courier New][FONT=monospace]

[ol]
[li][FONT=Courier New]System.out.print("Mensch oder Monster? ");[/li][li] wahl = scanner.next();[/li][li] [/li][li] if(wahl == „Mensch“)[/li][li] {[/li][li] if(angriffMensch > angriffMonster)[/li][li] {[/li][li] System.out.println(„Du hast gewonnen!“);[/li][li] }else[/li][li] {[/li][li] System.out.println(„Monster hat gewonnen!“);[/li][li] }[/li][li] }else[/li][li] {[/li][li] if(angriffMonster > angriffMensch)[/li][li] {[/li][li] System.out.println(„Du hast gewonnen!“);[/li][li] }else[/li][li] {[/li][li] System.out.println(„Mensch hat gewonnen!“);[/li][li] }[/li][/ol]
[/FONT]
[/FONT][/LEFT]

	 		 			[IMG]http://forum.byte-welt.net/images/bbcodemanager/light/code/01nc.png[/IMG] 			
		[IMG]http://forum.byte-welt.net/images/bbcodemanager/light/code/03nc.png[/IMG] 		 		 		 	    [/FONT][/LEFT]

Ja, das mit den Objekten war ein Flüchtigkeitsfehler. Normalerweiße kommt das nicht vor :smiley:

Danke für die super schnelle Antwort!

So, da es mir den Code irgendwie zerrissen hat, hab ich mich mal registriert.

So sollte es eig. aussehen:

Ah, mist. Ich hatte es fast richtig

    Kampf kampf = new Kampf();
   Kampf.kampf();

Da lag mein Fehler

Aber jetzt ein anderes Problem:

Wenn ich es ausführe, kommt meine Auswahl, und wenn ich “Mensch” eingebe, gibt es “Mensch hat gewonnen!” aus. Aber das dürfe laut dem iF garnicht vorkommen denn:

		System.out.print("Mensch oder Monster? ");
		wahl = scanner.next();

		if(wahl == "Mensch")
		{
			if(angriffMensch > angriffMonster)
			{
				System.out.println("Du hast gewonnen!");
			}else
			{
				System.out.println("Monster hat gewonnen!");
			}
		}else
		{
			if(angriffMonster > angriffMensch)
			{
				System.out.println("Du hast gewonnen!");
			}else
			{
				System.out.println("Mensch hat gewonnen!");
			}
		}

Ja, das mit den Methoden war ein Flüchtigkeitsfehler. Normalerweiße kommt das nicht vor

Danke für die super schnelle Antwort!

Strings muss man mit der equals Methode vergleichen (Vergleich von Werten). Mit dem == vergleicht man nämlich nicht den String also die eigentliche Zeichenkette, sondern die Objektreferenzen (und die sind dann immer unterschiedlich).

        wahl = scanner.next();
 
        if(wahl.equals("Mensch"))
        {
            if(angriffMensch > angriffMonster)
            {
                System.out.println("Du hast gewonnen!");
            }else
            {
                System.out.println("Monster hat gewonnen!");
            }
        }else
        {
            if(angriffMonster > angriffMensch)
            {
                System.out.println("Du hast gewonnen!");
            }else
            {
                System.out.println("Mensch hat gewonnen!");
            }
        }```

Da isser, der Aaah-Effekt :smiley:

Danke für die Hilfe, klappt alles wonderbra! :smiley:

Ich werds mir hier glaub ich noch kuschelig machen. Hier wird einem schnell und nett geholfen (nicht so wie bei anderen Boards hust) thumb up

€dit:

Und hier kommt auch gleich meine nächste Frage:

Wenn ich Mensch eingebe kommt jedes mal „Monster hat gewonnen“. Wenn ich Monster eingebe „Mensch hat gewonnen“.

Wenn ich nach den if-Verzweigungen noch ein
System.out.println(angriffMensch + "," + angriffMonster);
dranhänge, kommt „0,0“ raus, also sind beide Null.

Gibt’s da irgendwie eine Lösung? o.O

€dit2:

Ah, dummerchen, Fehler gefunden, nurnoch irgendwie beheben :smiley:

€dit3:

Vergessen die beiden methoden mensch() und monster() aufzurufen.

Das hab ich jetzt so gelöst:

[...]
        System.out.print("Mensch oder Monster? ");
        wahl = scanner.next();

	monster();
	mensch();
 
        if(wahl.equals("Mensch"))
[...]

So, jetzt klappts alles :smiley:

Sieht für mich aber ziemlich unelegant gelöst aus…gibt’s da vielleicht noch ne andere Lösung?

Es gibt viele Möglichkeiten ^^. Man könnte die Initialisierung der Werte z.B. im Konstruktor vornehmen also dort die Methoden aufrufen (meine Empfehlung) oder die Werte direkt initialisieren. Man könnte auch die angriffMensch und angriffMonster Werte direkt bei ihrer Deklaration durch statischen Code initialisieren (nicht empfohlen).

Hier meine Lösung mit dem Konstruktor

{
 
 
    public static void main(String[] args)
    {
        kampf();
    }
    
 
    Random r = new Random();
    Scanner scanner = new Scanner(System.in);
 
    int angriffMensch, angriffMonster;
    String wahl;

    public Kampf()
    {
         monster();
         mensch();
    }
...
...```

Zusätzlich könnte man noch in der kampf() Methode die Werte auf 0 prüfen und gegebenenfalls gleich initialisieren (was bei der Konstruktorlösung aber nur redundant wäre)...

Also das mit der Initialisierung (ich hasse es dieses Wort zu schreiben :twisted: ) im Konstruktor hab ich jetzt nicht so ganz verstanden :confused:

Naja, statisch…wäre auch noch dumm, weil ich das schöne Fight-Programm hier noch ausbauen werde. Waffen etc etc.

Hach, in den Ferien hat man echt nichts besseres zu tun, als Menschen gegen Monster kämpfen zu lassen. Wie damals im Kindergarten zurück erinner :o)

Hab grade oben nochmal was editiert.

Du rufst halt im Konstruktor der Klasse die Methoden auf. Beim Erzeugen des Objektes der Klasse (in der Main Methode) wird dann automatisch der Konstruktor aufgerufen und somit die Variablen angriffMensch, angriffMonster mit Werten belegt.

Ich komm grad nicht mehr mit…ich les es mir nochmal durch wenn ich ausgeschlafen bin :slight_smile:

Falls hier irgendwie Mods unterwegs sind, ihr könnte den Thread auf gelöst setzten.