Anfänger Frage - Ausgabe funktioniert nicht - Wieso?

Status
Nicht offen für weitere Antworten.

Unwissend

Mitglied
Hi! Ich habe wahrscheinlich eine totale Anfängerfrage, aber ich verstehe es einfach nicht.

[HIGHLIGHT="Java"]public class Mwert
{
int mittelwert;

//Kontruktor
Mwert()
{
mittelwert = 0;
}

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

public void ausgabe()
{
System.out.println("Mittelwert der letzten 3 Zahlen: " + mittelwert);
}

//Methode zum bilden des Mittelwerts von drei uebergemenen Werten
public void mittelwert(int wert1, int wert2, int wert3)
{
int mittelwert;
this.mittelwert = (wert1 + wert2 + wert3) / 3;
}
}[/HIGHLIGHT]


Folgende Fehlermeldung kommt:
"non-static method ausgabe() cannot be referended from a static context ausgabe()"

Wie kann ich denn die Methode mittelwert aufrufen und das Ergebnis davon ausgeben und das ohne eine weitere Klasse zu bilden? Irgendwo hängt es gerade bei meinem Verständnis? Hat jemand eine Lösung?

THX schon mal. =)
 
Zuletzt bearbeitet von einem Moderator:
Du müßtest in der main ein Objekt erstellen:
Code:
public static void main (String[] args)
{
    Mwert mwert = new Mwert();
    mwert.ausgabe();
}
 
Statt [HIGHLIGHT="Java"]public static void main (String[] args)
{

ausgabe();

}[/HIGHLIGHT]

Erzeugst du dir ein neues MWert - Objekt und rufst dessen Objekt-methoden auf.
Also z.B.:

[HIGHLIGHT="Java"]public static void main (String[] args)
{
Mwert first = new Mwert(); //neues objekt erstellen
first.mittelwert(1,2,5); //darauf methoden aufrufen
first.ausgabe();
}[/HIGHLIGHT]

Außerdem ist das deklarieren von int mittelwert in der berechnungsmethode da quatsch. Das objekt hat ja schon ein Feld mittelwert.
 
Hi!

Wäre super, wenn ihr mir noch eine Sache erklären könnt. Ich möcht eeigentlich einfach nur ein Array haben in das ich Werte speicher, die von der Tastatur aus eingelesen werden. Das hat vorhin auch schon geklappt. Und dazu noch eine Methode, die aus den letzten 2 eingelesenen Werten den Mittelwert bildet.

Mein Problem ist nun, dass er anscheinend das array und die Variable array_groesse nicht veröffentlicht oder so. Also keiner kennt sie. =/ Weder die main noch die Methode weiß irgendwas damit anzufangen. Wo liegt mein Fehler?
Ich dachte, dass ich ein Array direkt im Konstruktor erstellen sollte, so dass es bei jedem neuen Objekt sofort da ist. Wieso kann auf die Variable und das Array niemand zugreifen?

Ich scheine irgendwo noch einen grundlegenden Denkfehler zu haben. =/
Als ich noch alles in der main-Methode hatte funktionierte es auch. Aber was mache ich denn falsch? Wollte nur den Mittelwert und die Ausgabe in andere Methoden auslagern, die ich aufrufe? Und auch als ich das Array in der main-Methode deklariert hatte konnte die Mittelwert-Methode nicht daraufzugreifen und ich bekam eine Fehlermeldung.
Und wenn ich public vor die Variable array_groesse und das Array schreibe, dann kommt die Fehlermeldung "illegal start of expression". Bin etwas verwirrt. :bahnhof:

Übrigens schon mal Danke für den Tip eben, glaube den Teil habe ich einigermaßen verstanden. 😉



[highlight=Java]
import java.io.*;

public class Mwert
{
int mittelwert;


//Kontruktor
Mwert()
{
mittelwert = 0;
int array_groesse = 5; //Arraygroesse
float[] messwert = new float[array_groesse]; //Array erstellen
}

public static void main (String[] args)
{
Mwert first = new Mwert();

String line = "";

//Einlesen der einzelnen Werte
for(int i = 0, j = i + 1; i < array_groesse; i++, j++)
{
System.out.print("Wert " + j + " eingeben: ");
BufferedReader myInput2 = new BufferedReader(
new InputStreamReader(System.in));

line = "";

try {
line = myInput2.readLine();
} catch (IOException e) {
System.out.println(e);
}
messwert = Float.valueOf(line).floatValue();
}

first.mittelwert();
first.ausgabe();
}

//Methode zum Ausgeben
public void ausgabe()
{
System.out.println("Mittelwert der letzten 3 Zahlen: " + mittelwert);
}

//Methode zum bilden des Mittelwerts von drei uebergemenen Werten
public int mittelwert() {
int summe = 0;

// Mittelwertermittlung
for(int i = 0; i < array_groesse; i++) {
summe =+ messwert;
if ( i >= 2 )
summe = + messwert + messwert[i-1] + messwert[i-2];
}
mittelwert = summe / 3;

return mittelwert;
}
}
[/highlight]
 
Zuletzt bearbeitet:
Die Variablen auf die du versuchst zuzugreifen exisitieren nicht.
"array_groesse" ist abgesehen davon, dass es sich nicht an Namenskonventionen
hält (Besser: arrayGroesse), eine lokale Variable.

Lokal ist eine Variable dann, wenn sie innerhalb eines Blocks in einer Methode
oder einem Konstruktor deklariert wird, also zB

[HIGHLIGHT="Java"]int arrayGroesse;[/HIGHLIGHT]

Solche Variablen exisitieren dann nur innerhalb des Blocks, nach dem nächsten
"}" ist diese Variable gelöscht.

Eine andere Art von Variable, nämlich die, die du brauchst, sind sog. Member-Variablen
(wenn sie nicht-statisch sind) bzw Klassen-Variablen (statisch).

Ein Bsp dafür wäre dein mittelwert, das ist eine Member-Variable, und die exisitert
solange wie das Objekt.

Klassen-Variablen (statisch) existieren über die gesamte Lebenszeit des Programms.
(Sobald die Klasse erstmals benutzt wird)
Also mach zB arrayGroesse, wie auch mittelwert, als Member-Variable, und dann
kannst du in deinem Bsp in der main über

[HIGHLIGHT="Java"]first.arrayGroesse[/HIGHLIGHT]

darauf zugreifen.
 
Hi!

Also erstmal wieder vielen Dank! Habe die ganzen soweit umgesetzt und es läuft auch. Nun noch eine weitere Frage. Ich habe das Programm nun noch durch eine weitere Klasse ergänzt in der ich den Mittelwert für das gesamte Array berechnen wollte.
Es wird auch einwandfrei kompiliert nur ich habe das Problem, dass alle Arraywerte in der neuen Klasse anscheinend 0 sind. Die Klasse scheint gar nicht wirklich auf mein eigentliches Array zuzugreifen?! Auf die arrayGroesse kann die Klasse wiederum einwandfrei zugreifen? Was habe ich hier nicht bedacht?

[highlight=Java]
import java.io.*;

public class Mwert
{
float mittelwert;
float ges_mittelwert;
int arrayGroesse = 5;
float[] messwert = new float[arrayGroesse]; //Array erstellen

//Kontruktor
Mwert()
{
mittelwert = 0;
ges_mittelwert = 0;
}

public static void main (String[] args)
{
Mwert first = new Mwert();

String line = "";

//Einlesen der einzelnen Werte
for(int i = 0; i < first.arrayGroesse; i++)
{
System.out.print("Wert " + (i+1) + " eingeben: ");
BufferedReader myInput2 = new BufferedReader(
new InputStreamReader(System.in));

line = "";

try {
line = myInput2.readLine();
} catch (IOException e) {
System.out.println(e);
}
first.messwert = Float.valueOf(line).floatValue();

first.mittelwert();
System.out.println("Mittelwert der letzten 3 Zahlen: " + first.mittelwert);

//instantiiert die Klasse und ruft die Methode fuer den
//gesamten Mittelwert auf
MwertExt mw = new MwertExt();
mw.gesmittelwert();
}
}

//Methode zum bilden des Mittelwerts von drei uebergemenen Werten
public float mittelwert() {
float summe = 0;

// Mittelwertermittlung
for(int i = 0; i < arrayGroesse; i++) {
summe =+ messwert;
if ( i >= 2 )
summe = + messwert + messwert[i-1] + messwert[i-2];
}
mittelwert = summe / 3;

return mittelwert;
}
}


class MwertExt extends Mwert
{
public void gesmittelwert()
{
float gesamtsumme = 0;
float ges_mittelwert = 0;

//Gesamtmittelwert
for(int i = 0; i < arrayGroesse; i++)
gesamtsumme =+ messwert;

ges_mittelwert = gesamtsumme / arrayGroesse;

System.out.println("Gesamter Mittelwert lautet:" + ges_mittelwert);
}
}
[/highlight]
 
Huiui - was soll denn diese (sinnlose) Vererbung da jetzt?

In Zeile 44 wird ein vollkommen neues Objekt erzeugt. In diesem Objekt sind dann erstmal alle Werte 0 oder null.

Wahrscheinlich soll ja auch nicht bei jeden Schleifendurchlauf der gesamtmittelwert ausgegeben werden, sondern nur einmal am Ende?

Du solltest ggf. die genaue Aufabenstellung posten.

Im Moment(!) sieht es für mich so aus, als könntest du im wesentlichen zwei Methoden gebrauchen: Die main - wo die Eingabe erfolgt - und eine Methode
Code:
float berechneMittelwert(int anfang, int ende)
die den Mittelwert der Zahlen aus dem gegeben Bereich des "messwert"-Arrays berechnet. (Wenn man diese Methode in der Schleife mit
berechneMittelwert(i-2, i+1);
aufrufen würde, würde man den Mittelwert der letzten 3 Zahlen erhalten. Wenn man sie am Ende mit
berechneMittelwert(0, messwert.length);
aufrufen würde, würde man des Gesamtmittelwert erhalten.
Aber ob so eine Methode dem entspricht, was laut Aufgabenstellung gemacht werden soll, weiß ich natürlich nicht...
 
Hi!

Also die Aufgabenstellung ist eigentlich folgende. Wir sollen eine KLasse haben in der die Eingaben erfolgen und in dieser Klasse eine Methode, die den Mittelwert der letzten 3 Eingaben ermittelt.
Davon abgeleitet soll ein Klasse erstellt werden, die den Mittelwert von allen bisher eingegebenen Zahlen ermittelt.

Naja, und das er es nicht jedes Mal wieder ausgibt sondern nur am Ende lässt sich ja eigentlich schnell ändern. Ich hab bloß noch ein Problem damit, dass ich eine neue Klasse von der schon vorhandenen ableite und dann die Array-Werte plötzlich alle null sind. Naja, wenn ich damit ein neues Objekt erzeuge,....hmmm......dann ist das klar. Hat jemand einen Lösungsvorschlag? =)
 
Ja, da gibt's mal wieder 1000 Möglichkeiten, und ich vermute, dass du die Aufgabenstellung entweder unpräzise wiedergegeben hast, oder dass sie unpräzise IST. Sollen die Zahlen für beide Klassen getrennt eingegeben werden? Wenn nicht, könnte man eine Kopie des Arrays an die abgeleitete Klasse übergeben, oder sonstwas...
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben