Methode aus main() aufrufen

Moment mal... jetzt hab ich auch mal was zu sagen...

Ja, Dummerweise habe ich das Array Hunde in der for schleife erstellt. Ist aber längst kein Thema mehr, da es nun außerhalb steht. Darauf hatte mich aber auch schon VScan aufmerksam gemacht. Dieser Fehler liegt aber nicht daran dass ich GAR keine Ahnung habe, sondern mich einfach vertan habe. Soll ja vorkommen können.

Zu deiner Anmerkung, über Selbstinstanzierungen weiß ich bescheid. ABER: Man kann nicht in der Instanz in der main() läuft, auf Methoden in der selben Klasse zugreifen. Dazu muss ich immer noch EIN OBJEKT ERSTELLEN. Und da kann ich dann auch eins der Klasse erstellen, in der auch main() ist. Ist ja ab dem Zeitpunkt Wurst. Objekt ist Objekt. Ja, was sagst du denn, was ich nicht sag? Immer diese Missverständnisse....

Es ist nicht so, dass ich kein Java generell kann, die Grundlagen konnte ich, hab nur die letzte Zeit eher mich mit c++ beschäftigt und nun fängt unser Infolehrer mit Java an, weil er meint, das wir das bräuchten und das immer und überall und so weiter und sofort.(Nicht das Java schlecht wäre, Gott bewahre..)

So, und was du unter 2) schreibst verstehe ich teilweise nicht. Was willst du mir damit sagen?
Wenn du
Java:
W1.Hunde[schleife].bellen();
schreiben willst, das läuft nicht.


Übrigens, ich habe alles was VScan schreibt verstanden, da einleuchtend. Jedoch erscheint mir das eine Array überflüssig, weshalb ich nach einer eleganteren Lösung suche. Es sei denn es gibt keine.

@SPiKEe Da ich wusste, dass das ganze auf ein problem mit meinen halb verdängten Java-Grundlagen zurückkommen wird, hab ich ja extra den ganzen Thread in "Java-Grundlagen" erstellt.


Nochmal... warum kann ich nicht das Array Hunde in main() ansprechen? und wenn ich es kann, wie? (wenn nicht, warum nicht)

Danke aber für die Lösung mit dem "HundeArray", das läuft (natürlich nur mit Hunde außerhalb der for-schleife) ;)
 
Zuletzt bearbeitet:
ABER: Man kann nicht in der Instanz in der main() läuft, auf Methoden in der selben Klasse zugreifen.

...

Ja, was sagst du denn, was ich nicht sag? Immer diese Missverständnisse...

Lustiger weise liegt hier das Missverständnis bei DIR.
Guck dir doch oben mal unsere Beispiele zur Selbstinstanzierung an ... man kann sehr wohl auf NICHT-STATISCHE-Methoden aus der MAIN-Instanz zugreifen ... WEIL : Was genau denkst du denn wäre die MAIN-Instanz ... es ist nämlich genau die Instanz die du in deinem Beispiel auch verwendest ... davon abgesehen das du das ganze auch noch prozedual und nicht objekt-orientiert geschrieben hast.


Das w1.hunde[index] nicht funktioniert ist klar ... aber das solltest du aus deinen Programmiererfahrungen von denen du hier schwärmst wissen ...
Denn Hund[] hunde ist eine Member-Variable von public void Hundeerstellen(). Damit du nun von außen auf hunde zugreifen kannst musst du es erstmal zu einer Klassen-Variablen machen ... und zwar in dem du die Deklaration außerhalb von public void Hundeerstellen() schreibst. Wenn du jetzt wirklich nicht weist wie ich das meine dann frage deinen Info-Lehrer bitte vorher erstmal über den Aufbau von Klassen aus ... weil ich glaube diese wirklich einfach Grundlage sollte er dir bis jetzt vermittelt haben. Und wenn nicht hilft Google da ein ganzes stück weiter ... dafür muss sich hier keiner von uns Zeit an dir verschwenden ... das machst du bitte selbst wenn du wirklich gewillt bist zu lernen.
Was deine Meinung zum zweiten "überflüssigen" Array angeht geb ich dir recht. Weil so erhälts du nur eine Kopie des Arrays. Wenn sich das original also ändert bekommst du das in der Kopie schon nicht mehr mit ... darum solltest du OOP-mäßig auch über eine Referenz mit dem Original arbeiten.


@generic
Es ist echt immer wieder traurig wie Anfänger hier her kommen , mit ihren Programmiererfahrungen pralen und meinen nur von Java speziell noch nicht so viel Ahnung zu haben. Sind denn andere Sprachen wirklich so anders als Java ? Ich wette nicht. Zumindest die pupolären Sprachen weisen in solchen Punkten gemeinsamkeiten mit Java auf.
 
Verdammte Axt, jetzt reicht es aber mal langsam, ja?

Habe ich gesagt ich kenne mich in Java gut aus? nein. Hab ich gesagt, dass ich mir mal gewisse Java Grundlagen angeeignet HATTE? ja.
Dass ich mich mit C++ beschäftigt habe heißt doch auch nicht, dass ich dort ein Meister meiner Kunst bin, oder?, denn das bin ich garantiert nicht. Prahlen tut man doch auch nicht, wenn man eingesteht, dass man den Großteil wieder vergessen hat, oder? Und überhaupt, wieso eigentlich so unfreundlich?

Die ganze main-geschichte ist doch eigentlich vollkommen unwichtig. Auch wenn ich immernoch der Meinung bin, dass du schon wieder das gleiche schreibst wie ich. Du hast doch in deinem eigenen Beispiel am Anfang die Klasse mit main instanziert. Also ein Objekt erstellt. In diesem Objekt hast du dann deine Nicht-statische Methode aufgerufen. Aber du musstest ersteinmal dieses Objekt erstellen. Ohne ein Objekt, eine neue Instanz kann ich aus der statischen Methode main auf keine Methode in ihrer Klasse zugreifen, die nicht-statisch ist. Oder auch:
Static methods can only call other static methods in their class (or they need to use an explicit object for the call)

Ich lasse mich hier weder zum Vollidioten noch Großmaul abstempeln.(sehr ungern)

Tut mir leid, dass ich deinen vorherigen post nicht ganz verstanden habe, aber darum muss man noch lange nicht so abwertend werden.

Es ging mir nur um diesen Fehler den ich gerne beheben möchte. Dass das ganze nicht schön ist und auf jeden Fall besser ginge ist mir auch klar. Darum geht es aber auch gar nicht.

Fehlermeldung und meine Unwissenheit über "wie rufe ich das ganze denn richtig aus main() auf?" haben mich zu diesem Thread gebracht.

Und übrigens: Danke für die dennoch enthaltenen Infos in deinem Post. Habe jetzt Hunde gleich in der Klasse deklariert und die main entsprechend angepasst. läuft.

*Zähneknirschendes Danke*
 
Zuletzt bearbeitet:
Hallo,

vielleicht solltet Ihr beide mal einen Gang zurück schalten, dass er keine Erfahrung hat, ist klar... aber man kann bei diesem primitiven Beispiel eine Ausnahme machen, da es ja unter Grundlagen steht und nicht sehr viel Aufwand erzeugt, bei aufwendigeren Arbeiten würde ich auch sagen, erstmal folgendes studieren: http://openbook.galileocomputing.de...00_001.htm#mj58b119301920569a446c9c510503f310

(Laut SPiKEe ausgebessert.. :)

Da es in Java keine Pointer oder Referenzen (zumindest bei primitiven Typen) gibt, kann man ja den Array wie SPiKEe beschrieben hat anders modifizieren (Thema: Zugriffsmodifizierer), z.B. mit "Public", somit muss man den Array nicht nochmal erstellen.
Das sieht dann wie folgt aus:

Hundeapp:
Java:
public class HundeApp
{
	public static void main(String[] args)
	{
        Wurfmaschine W1 = new Wurfmaschine();
        W1.sethundeanzahl();
        W1.Hundeerstellen();

        for(int schleife = 0; schleife < W1.gethundeanzahl(); schleife++)
        {
        	W1.hundeArray[schleife].bellen();
        	W1.hundeArray[schleife].eigenschaften();
        }
    }
}

dann hier noch die Wurfmaschine:

Java:
import javax.swing.*;

public class Wurfmaschine 
{
	private int hundeanzahl;
	
	/*
	 * würde eine ArrayList mit der Thematik <generic> bevorzugen, da es
	 * leichter zu handhaben ist, aber das ist eine Fleißarbeit :) siehe
	 * "Java ist auch eine Insel"
	 */
	public Hund[] hundeArray = null;

	public void Hundeerstellen() 
	{
		// array erstellen
		hundeArray = new Hund[hundeanzahl];
		// hund initiieren
		Hund hu = null;

		for (int i = 0; i < hundeanzahl; i++) 
		{
			// hund instanzieren
			hu = new Hund();
			hu.setgröße(this.randomgröße());
			hu.setrasse(this.randomrasse());
			hu.setname(this.randomname());
			hu.setgewicht(this.randomgewicht());
			hu.setanzahlbellen(this.randomanzahlbellen());
			hu.setlaut(this.randomlaut());
			hundeArray[i] = hu;
		}
	}

	public void sethundeanzahl() {
		String hundeanzahlstring = JOptionPane
				.showInputDialog("Wieviele Hunde sollen geworfen werden?");
		this.hundeanzahl = Integer.parseInt(hundeanzahlstring);
	}

	private double randomgröße() {
		return Math.random() * 120;
	}

	private double randomgewicht() {
		return Math.random() * 60;
	}

	private String randomrasse() {
		String[] rassen = { "Dalmatiner", "Fußhupe", "Deutscher Schäferhund",
				"vom Mars", "Hax0r" };
		return rassen[(int) Math.random() * rassen.length];
	}

	private String randomname() {
		String[] namen = { "Harry", "Plokro", "Ytsori", "Rex", "zufig", "1337" };
		return namen[(int) Math.random() * namen.length];
	}

	private int randomanzahlbellen() {
		return (int) Math.random() * 5;
	}

	private String randomlaut() {
		String[] laute = { "pfuuf", "Wuff", "Wau", "Pasdouf", "1337" };
		return laute[(int) Math.random() * laute.length];
	}

	public int gethundeanzahl() {
		return hundeanzahl;
	}

	public Hund[] getHundeArray() {
		return hundeArray;
	}
}

Ich glaube im übrigen auch, dass etwas mehr lesen, z.B. im oben genannten Link, viel helfen würde, ohne dir zu nahe zu treten, wäre es auch angebracht!

Viele Grüße
 
Zuletzt bearbeitet von einem Moderator:
@VScan
Du weist aber schon das es die JavaInsel mitlerweile in Version 9 gibt oder ? Wäre zumindest etwas aktueller und beschreibt auch einige Veränderungen in den neueren Versionen von Java.
Auf das offizielle Release von Java7 und einer dazu passendne JavaInsel warte allerdings auch ich schon recht lange.
 
Danke, ich werde mich mit Java in der nächsten Zeit mehr befassen und auch nachlesen, nur wollte mir der Fehler nicht in den Kopf. Hab das ganze jetzt so ähnlich wie VScan in seinem Quelltext, nur dass ich halt noch den namen Hunde verwende(verwirrend, ok, allerdings sollte dieses primitive Beispielprogramm ja auch nur ein Praktisches Anwenden von Grundlagen sein. Eine Übung.).

Dann versteht man auch noch die Fehlermeldung nicht, will aber nicht warten und denkt sich: frag ich doch mal in einem Forum nach. Tja...
Wenn ich das nächste mal etwas hier frage, dann werd ich aber auf jeden Fall
1)mich strikter an die Konventionen halten
2)das ganze von Anfang an spezieller behandeln
3)und erst gar nicht unausgereifte Sachen reinstellen

Danke an alle die hier mir geholfen haben und Entschuldigung an SPiKEe wenn ich etwas unfreundlich war, doch freundlich war deine Beratung ja auch nicht durchweg.
Wie gesagt, tut mir leid, dass ich dazu beigetragen habe, dass die Diskussion einen solchen Verlauf nimmt. War nicht meine Absicht.
 
Gut ... ja ... ich geb es zu ... ich war etwas angenevt als ich meine Posts geschrieben habe das mal wieder so ein doch einfacher Anfängerfehler gepostet wurde. Eigentlich muss ich mich entschuldigen was ich hiermit auch tue. Und recht habt ihr alle 3 : ich sollte demnächst mal wieder etwas höflicher sein =P

Was die Konventionen angeht : frag mal die anderen hier im Forum wie wenig ich mich am Anfang dran gehalten habe bis ich in genau solche Probleme gerannt bin wie es mir jemand gesagt hat : halte dich an die Konventionen , das führt auf jeden Fall zu weniger Fehlern. Und recht hatte dieser Jemand. Gut .. es gibt zwar immer noch eine Eigenart von mir , nämlich die öffnende geschweifte Klammer. Laut Konventionen und jahrzehnte alter Angewohnheiten von Programmieren wird diese nämlich ans Ende der Deklarations-Zeile gesetz. Ich allerdings habe es mir von Anfang an angewöhnt diese Klammer in eine neue Zeile drunter zu setzen weil ich persönlich dies mit richtiger Einrückung leslicher finde , aber sowas ist echt ein Streitpunkt da es dem Compiler im Endeffekt eh egal ist.
Aber ganz wichtig : nutze einen Editor mit Syntax-Highlightning. In den meisten IDE's sollte das der Fall sein ... aber falls du wie ich mit Editor und Console arbeitest empfehle ich dir Notepad2 oder Notepad++. Denn dadurch vermeidet man einen großteil der Syntax-Fehler.
 
Zurück