[Gelöst] Cannot make a static reference ...

Status
Nicht offen für weitere Antworten.

Localhope

Mitglied
Hallo. Ich bin gerade dabei ein wenig Java zu üben. Dabei habe ich folgendes Programm geschrieben. Was das Programm bewirken soll, ist denk ich ersichtlich:

Code:
public class Konto {
	private double kontoStand;
	private String name;
	private double betrag;

	public Konto() {
		kontoStand=200;
		betrag=10;
		name="Frieda";
	}
	
	//Methoden
	public double getKontostand(){
		return kontoStand;
	}
	
	public void gutschreiben (double betrag){
		this.kontoStand=kontoStand+betrag;
	}
	
	public void abheben(double betrag){
		this.kontoStand=kontoStand-betrag;
	}
	
	public static void main(String[] args) {
		Konto konto1 = new Konto();
	Y	String name;
	Y	double betrag;
		System.out.println("Name: " + name);
	X      System.out.println("Kontostand: " + kontoStand);
		
		konto1.getKontostand();
		konto1.gutschreiben(betrag);
	X      System.out.println("Kontostand nach Gutschrift: "+kontoStand);
		
		konto1.abheben(betrag);
	X      System.out.println("Neuer Kontostand nach Abzug: " + kontoStand);

	}

}

Das Programm meldet allerdings Fehler, die da lauten:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Cannot make a static reference to the non-static field kontoStand
Cannot make a static reference to the non-static field kontoStand
Cannot make a static reference to the non-static field kontoStand

at Konto.main(Konto.java:31)

und zwar in den Zeilen welche ich mit einem X vorweg markiert habe.

Nun wird mir als Verbesserungsvorschlag gegeben, den kontostand als static zu deklarieren. Allerdings verändert sich dann der Betrag darin nicht mehr (oder?). Und man soll immerhin etwas abziehen können (Beispiel). Da ja auch die Variablen bekannt sein müssen in der main, habe ich schon die Zeilen (markiert mit einem Y) eingefügt. Obwohl das im Unterricht bei anderen nicht nötig war. Leider weiß ich nicht mehr, was ich noch eingeben soll. Habe schon rumexperimentiert, das ist aber mehr gucken-was-geht anstatt wissen. wie kann ich ihm kontoStand bewusst machen (main)? Gebe ich es ein wie in Y markiert, kommen noch mehr Fehler (+3 Fehler mehr). Ihr seht bestimmt den Fehler sofort. Ich suche mich hier tot.. :-/
 

The_S

Top Contributor
Einfach getter und setter für deine Kontostand Klasse schreiben und dann die Variablen über diese getter der klasse Kontostand ansprechen!
 

Localhope

Mitglied
Guten Morgen und vielen Dank,

wir dürfen leider nur 3 Methoden haben, eine dazufügen ist dann an der Aufgabe vorbei. Es gibt nur getKontoStand, gutschreiben und abheben.

Ich habe das dann wie folg umgeändert:

Code:
public class Konto {
	private double kontoStand;
	private String name;

	public Konto() {
		kontoStand=200;
		name="Frieda";
	}
	
	//Methoden
	public double getKontostand(double betrag,String name, double kontoStand){
		return kontoStand;
	}
	
	
	public void gutschreiben (double betrag){
		this.kontoStand=kontoStand+betrag;
	}
	
	public void abheben(double betrag){
		this.kontoStand=kontoStand-betrag;
	}
	
	public static void main(String[] args) {
		Konto konto1 = new Konto();
		
		
		System.out.println("Name: " + name);
		System.out.println("Kontostand: " + kontoStand);
		
		konto1.getKontostand();
		konto1.gutschreiben(betrag);
		System.out.println("Kontostand nach Gutschrift: "+getKontoStand);
		
		konto1.abheben(betrag);
		System.out.println("Neuer Kontostand nach Abzug: " + getKontoStand);

	}

}

Also den Betrag und Namen aus der main raus, und in getKontoStand alle Variablen rein. Anscheinend bin ich zu blöd, da das Programm mehr Fehler als vorher ausgibt. Ich vermute mal das Hauptproblem ist, dass ich den namen und den betrag aus der main genommen habe und die main diese Variablen nun nicht mehr kennt. Die Fehlermeldungen sind nun wie folgt:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Cannot make a static reference to the non-static field name
Cannot make a static reference to the non-static field kontoStand
The method getKontostand(double, String, double) in the type Konto is not applicable for the arguments ()
betrag cannot be resolved
getKontoStand cannot be resolved
betrag cannot be resolved
Cannot make a static reference to the non-static field kontoStand

at Konto.main(Konto.java:29)
 

The_S

Top Contributor
naja, dann mach die Variablen eben public. Generell solltest du dir mal ein bisschen was zum Thema "static" an wissen anlesen. In den FAQ findest du ein gutes Beispiel dazu! Außerdem ist Java Case-Sensitive!

Hier ein Beispiel wie es so zumindest geht. Aber kA wie das euren Anforderungen entspricht, kenne die ja nicht genau.

Code:
public class Konto {
   private double kontoStand;
   public String name;

   public Konto() {
      kontoStand=200;
      name="Frieda";
   }
   
   //Methoden
   public double getKontostand(){
      return kontoStand;
   }
   
   
   public void gutschreiben (double betrag){
      this.kontoStand=kontoStand+betrag;
   }
   
   public void abheben(double betrag){
      this.kontoStand=kontoStand-betrag;
   }
   
   public static void main(String[] args) {
      Konto konto1 = new Konto();
      
      
      System.out.println("Name: " + konto1.name);
      System.out.println("Kontostand: " + konto1.getKontostand());
      
      konto1.getKontostand();
      konto1.gutschreiben(betrag);
      System.out.println("Kontostand nach Gutschrift: "+ konto1.getKontostand());
      
      konto1.abheben(betrag);
      System.out.println("Neuer Kontostand nach Abzug: " + konto1.getKontostand());

   }

}
 

Localhope

Mitglied
Ja, das ist das Problem. Wenn wir die Variablen als public deklarieren, gibt es Ärger, da das wohl sehr unsicher sei. Wird das bemerkt oder schreibt man das so, ist es 'falsch'. Dürfen wir also nicht.

Static haben wir erst vor kurzem gehabt, die Aufgabe ist aber aus der Zeit davor, d.h. als wir noch kein static kannten, mussten wir die Aufgabe trotzdem lösen können.

Das man eine Anweisung in dieser Form:
System.out.println("Neuer Kontostand nach Abzug: " + konto1.getKontostand());

hineinschreibt, habe ich so auch noch nie gesehen. Was bewirkt das? Warum kann ich nicht einfach kontoStand hineinschreiben? Oder einfach nur '+ name);' ? So wurde das bei uns immer gemacht. Eben die Variable dort hineinzuschreiben. Gibt es dafür auch eine Lösungsmöglichkeit?

Warum hast du in

Code:
public double getKontostand(){
      return kontoStand;

meine Variablen rausgenommen? Was bewirkt es, wenn ich sie da einfüge? (Ich habe das gemacht, weil ich dachte, so mit der get-Methode, die ich über die main anspreche, die Variablen bekanntzumachen. Wie in deinem ersten Tip angegeben.)
 

The_S

Top Contributor
Localhope hat gesagt.:
Ja, das ist das Problem. Wenn wir die Variablen als public deklarieren, gibt es Ärger, da das wohl sehr unsicher sei. Wird das bemerkt oder schreibt man das so, ist es 'falsch'. Dürfen wir also nicht.

Ne Erklärung dazu wäre evtl. angebracht, ich liebe diese Leute die einem etwas verbieten, aber nicht erklären warum :roll: . Auch hier hilft ein Blick in die FAQ!

Localhope hat gesagt.:
Static haben wir erst vor kurzem gehabt, die Aufgabe ist aber aus der Zeit davor, d.h. als wir noch kein static kannten, mussten wir die Aufgabe trotzdem lösen können.

Schaus dir nochmal an, ist für OOP wichtig!

Localhope hat gesagt.:
Das man eine Anweisung in dieser Form:
System.out.println("Neuer Kontostand nach Abzug: " + konto1.getKontostand());

hineinschreibt, habe ich so auch noch nie gesehen. Was bewirkt das? Warum kann ich nicht einfach kontoStand hineinschreiben? Oder einfach nur '+ name);' ? So wurde das bei uns immer gemacht. Eben die Variable dort hineinzuschreiben. Gibt es dafür auch eine Lösungsmöglichkeit?

Wenn du weißt, was static ist, dann verstehst du das ;) .

Localhope hat gesagt.:
Warum hast du in

Code:
public double getKontostand(){
      return kontoStand;

meine Variablen rausgenommen? Was bewirkt es, wenn ich sie da einfüge? (Ich habe das gemacht, weil ich dachte, so mit der get-Methode, die ich über die main anspreche, die Variablen bekanntzumachen. Wie in deinem ersten Tip angegeben.)

Weil sie sinnlos sind. Parameter übergeben macht nur sin, wenn man anschließend auch etwas mit ihnen macht (Verarbeitung, Rückgabewert anhand der Variablen ändern, ...). Du veränderst aber weder Werte durch deine Parameter (was bei get auch nicht üblich ist) noch wird durch die Parameter das Rückgabewert beeinflusst. Also sind sie sinnlos ;) .
 

Localhope

Mitglied
Ah ok, ich bin gerade dabei die Sachen zu static zu lesen. Nur wie gesagt, als wir static noch nicht kannten, mussten wir die Aufgabe auch schon lösen können. Und wenn ich in die Aufgabe static reinschreibe (bin gerade dabei meine Mappe zu vervollständigen, da mir der Code zu der Aufgabe fehlt), ist das schon sehr komisch, da wir das noch nicht wissen konnten. Das wäre dann 'an der Aufgabe vorbei'. Gibt es da keine Lösung für, wenn man nur weiß was Variablen sind, getter, Methoden, Kontruktor und die Ausgabe? Und man die main so halbwegs schreiben kann wie ich das erste Programm geschrieben habe? Da komme ich wie gesagt nicht weiter. Das static ist mir hilfreich für meine weiteren Aufgaben. Für den Link danke ich dir, ich lese gerade mit Begeisterung :D aber in der jetzigen Aufgabe ist es leider nicht Sinn, static zu verwenden.
 

Tobias

Top Contributor
Hobbits Lösung benutzt doch gar kein static? Bzw nur da, wo es absolut unvermeidbar ist - nämlich bei der main()?

mpG
Tobias
 

The_S

Top Contributor
Ich sage auch nicht, dass du es mit static lösen sollst. Ich sage, dass du es OHNE static lösen sollst. Aber wie du von einer statischen Methode auf eine nicht statische Methode zugreifen kannst, und was überhaupt eine statische Methode ist, lernst du, wenn du weißt, was static bedeutet ;) !
 

Localhope

Mitglied
Ok, dann habe ich mich verlesen, pardon.

Nun, das mit

konto1.abheben(betrag);
System.out.println("Neuer Kontostand nach Abzug: " + konto1.getKontostand());

kenne ich wie gesagt nicht so. Und

public String name;

dürfen wir ja auch nicht, da es 'unsicher' sei. Meine Mitschüler haben es ja auch so gelöst, ohne das oben. Nur möchte ich das ja irgendwie selber erarbeiten anstatt mir den Code zu 'klauen'. nur bei kontoStand zickt er eben rum. Ich glaub ich bin völlig verwirrt und sollte mal eher n bisl Abstand zu der Aufgabe nehmen und mich dann nochmal ransetzen...
 

The_S

Top Contributor
Glaub ich auch, und unbedingt vorher alles wissenswerte zu static aneigenen. Evtl. vorher auch n bisschen mit static rumarbeiten.
 
G

Gast

Gast
Also:

Du hast ein Objekt Konto namens Konto1. Dieses Objekt hat die Eigenschaften kontostand, name und betrag. All diese Variablen besitzen INNERHALB des Objekts Gültigkeit und können, da sie "Privatsache" des Objekts sind, nicht von außerhalb angesprochen werden. Das zeigt das "private" vor den Variablennamen. Die Main-Methode ist static, dass heißt, dass sie nicht zum Objekt, sondern zur Klasse gehört. Merkst du was? Genau, sie gehört nicht zum Objekt, kann also den privaten Kram des Objekts nicht sehen. Deshalb ist es nicht möglich, in der main einfach den kontostand anzusprechen.
Die Methode getKontostand() liefert nun den Kontostand als Rückgabewert und sie ist public=öffentlich. Du kannst also von außerhalb des Objekts, z.B. in der main() über getKontostand() auf den Kontostand zugreifen. Dabei musst du dem Computer aber sagen, welches Konto-Objekt er ansprechen soll (es kann ja nicht nur Konto1, sondern theoretisch auch noch Konto2, Konto3 ... Konto3656 geben). Damit der Computer weiß, welches Objekt er nehmen soll, musst du den Objektnamen dazuschreiben.
Code:
Konto konto1=new Konto();
konto1.getKontostand();
Jetzt gibt die letzte Zeile den Kontostand zurück, ABER der Computer weiß noch nicht, was er damit machen soll. Er soll das Ding auf dem Bildschirm ausgeben, also übergeben wir es an System.out.println(); Dabei können wir einen String davorhängen
 

Localhope

Mitglied
Ja, das habe ich verstanden, habe es ja auch schon in meinem allerersten Post angewendet, bzw. mache ich das immer so. Aber wie gesagt, ich muss erst mal schauen. Daher setze ich das Thema auch noch nicht auf gelöst. Ich poste dann die Lösung, und wenn ich da was verbessern kann, wäre ich über Kritik sehr dankbar.

PS: Ich habe das hier gefunden: http://www.java-forum.org/de/viewtopic.php?t=4354
Wahrscheinlich sollen wir die Variablen deshalb eben alle private machen.
-----------------
Edit:
Ich hab die Aufgabe gelöst! Habe mir nochmal das zu static angeschaut. So durch und durch verstanden habe ich es nicht, da wir im unterricht einfach immer nur objekt.methode(parameter); geschrieben haben und in den Aufgaben hat es immer funktioniert, aber ich weiß nun, was ich machen muss, wenn der Fehler auftaucht. Meine Lösung (gibt es da noch etwas zu verbessern?)

Code:
public class Konto{
	private float kontoStand;
	private String name;
	private float betrag;
	
	public Konto(){
		kontoStand=1200f;
		name="Tux";
	}
	
	public float getKontoStand(float kontoStand){
		return kontoStand;
	}
	
	public void gutschreiben(float kontoStand, float betrag){
		this.kontoStand=kontoStand+100;
	}
	
	public void abheben(float kontoStand, float betrag){
		this.kontoStand=kontoStand-350;
	}
	
	public static void main(String[] args){
		Konto konto1 = new Konto();
		
		System.out.println("Kontostand: " +konto1.kontoStand);
		
		konto1.gutschreiben(konto1.kontoStand, konto1.betrag);
		System.out.println("Kontostand nach Gutschrift: "+konto1.kontoStand);
		
		konto1.abheben(konto1.kontoStand, konto1.betrag);
		System.out.println("Kontostand nach Abzug: "+konto1.kontoStand);
		
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Habe ich die Aufgabe richtig gelöst? Java Basics - Anfänger-Themen 3
H Aufgabe so richtig gelöst? Java Basics - Anfänger-Themen 14
P Erste Schritte [gelöst]Erzeugen einer Klasse aus der Klassenbibliothek Java Basics - Anfänger-Themen 4
F Erste Schritte (Gelöst) Anfängerfrage Arraylist ausserhalb der Main Methode Java Basics - Anfänger-Themen 2
X problem mit equals.gelöst Java Basics - Anfänger-Themen 2
N Aufgabe richtig gelöst? Java Basics - Anfänger-Themen 7
M Ist diese Aufgabe zu umständlich gelöst? Java Basics - Anfänger-Themen 9
S Aufgabe gelöst, lässt sich aber nicht kompilieren Java Basics - Anfänger-Themen 3
J Vereinigung von 2 Mengen [gelöst] Java Basics - Anfänger-Themen 2
W ProcessBuilder Problem -->gelöst - - Jetzt JEditorPane Problem Java Basics - Anfänger-Themen 6
A [gelöst]Array mit ArrayList-Einträgen Java Basics - Anfänger-Themen 12
B While Schleife steuern (gelöst) Java Basics - Anfänger-Themen 2
Strahlungsleck [gelöst]File Pfadangabe funktioniert nicht mit Servername/IP Java Basics - Anfänger-Themen 2
A [gelöst]Aus der Klasse heraus auf ein anderes Objekt zugreifen Java Basics - Anfänger-Themen 4
A [gelöst]Zwei Ausgaben, die eigentlich gleich sein sollten Java Basics - Anfänger-Themen 9
A [gelöst]Objekte in einer Schleife erzeugen Java Basics - Anfänger-Themen 9
A [gelöst]ArrayList Java Basics - Anfänger-Themen 6
Bloodredangel [gelöst] Kompilieren von .java-Dateien per javac Java Basics - Anfänger-Themen 5
J Aufgabenverteilung über einen Zeitraum: So geschickt gelöst? Java Basics - Anfänger-Themen 3
S [gelöst] Wie kann ich später über Objekte zeichnen Java Basics - Anfänger-Themen 2
D Probleme bei Code Portierung von C# nach Java [Gelöst] Java Basics - Anfänger-Themen 4
L [Gelöst:] positive Null Java Basics - Anfänger-Themen 4
L Gelöst: Negative Eingaben sollen verweigert werden Java Basics - Anfänger-Themen 3
L [gelöst] Einfache Aufgabe, läuft aber nicht. Java Basics - Anfänger-Themen 8
vogella *Gelöst *Im Programm warten (wait()) Java Basics - Anfänger-Themen 2
S die konsole[gelöst] Java Basics - Anfänger-Themen 16
S schaltjahr (gelöst zu 90 %), allerdings folgeprob :/ Java Basics - Anfänger-Themen 18
W Cannot find Symbol Java Basics - Anfänger-Themen 5
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
D Cannot find JUnit.framework Java Basics - Anfänger-Themen 1
W Cannot resolve symbol 'HttpServlet' Java Basics - Anfänger-Themen 2
I JSON - cannot deserialize from Object value Java Basics - Anfänger-Themen 16
J Scanner cannot be resolved to a type Java Basics - Anfänger-Themen 3
N Fehler "Cannot instantiate the type" Java Basics - Anfänger-Themen 3
jakobfritzz Array- cannot invoke "" because "" is null Java Basics - Anfänger-Themen 4
Flo :3 Variablen Type dismatch: cannot convert from string to int Java Basics - Anfänger-Themen 9
C system cannot be resolved Fehler in Eclipse Java Basics - Anfänger-Themen 18
V ClientProtocolException cannot be resolved Java Basics - Anfänger-Themen 6
A Cannot find symbol mit Konstruktoren Java Basics - Anfänger-Themen 27
A Cannot find symbol bei exceptions Java Basics - Anfänger-Themen 2
J The import org.bukkit cannot be resolved Java Basics - Anfänger-Themen 3
J Fehlermeldung unklar. non-static variable player0 cannot be referenced from a static context Java Basics - Anfänger-Themen 4
P non-static variable cannot be referenced from a static context Java Basics - Anfänger-Themen 6
L cannot find symbol variable Kon Java Basics - Anfänger-Themen 8
L constructor cannot be applied... Java Basics - Anfänger-Themen 22
F Erste Schritte error: cannot find symbol Java Basics - Anfänger-Themen 5
M Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 10
P a cannot be resolved bei einer do while Schleife Java Basics - Anfänger-Themen 1
R return: cannot find symbol Java Basics - Anfänger-Themen 2
L Bluej Error: Cannot find Symbol Java Basics - Anfänger-Themen 13
Aprendiendo Interpreter-Fehler "non-static variable this cannot be referenced from a static context" Java Basics - Anfänger-Themen 2
M Iterator cannot refer to a non final... Java Basics - Anfänger-Themen 20
S Cannot find symbol (symbol ist eine Variable) Java Basics - Anfänger-Themen 13
N Cannot find symbol Java Basics - Anfänger-Themen 18
T Error: int cannot be dereferenced Java Basics - Anfänger-Themen 10
J JLabel cannot be resolved Java Basics - Anfänger-Themen 8
H Variablen error: non-static variable cannot be referenced from a static context Java Basics - Anfänger-Themen 4
P Cannot find symbol, wieso? Java Basics - Anfänger-Themen 5
UnityFriday method getPrevious in class List<ContentType> cannot be applied to given types Java Basics - Anfänger-Themen 29
M Erste Schritte cannot find symbol - Probleme mit Klassen Java Basics - Anfänger-Themen 6
B OOP next cannot be resolved or is not a field Java Basics - Anfänger-Themen 6
B OOP Cannot instantiate the type AuDList<Integer> Java Basics - Anfänger-Themen 18
U Erste Schritte cannot be referenced from a static context Java Basics - Anfänger-Themen 1
J Error: cannot find symbol - variable Java Basics - Anfänger-Themen 3
D Java Eclipse cannot be cast to java.awt.event.ItemListener Java Basics - Anfänger-Themen 3
F Erste Schritte parseint: cannot find symbol Java Basics - Anfänger-Themen 6
J Fehlermeldung : cannot invoke char(at) int on the primitive type int --- Anfänger Java Basics - Anfänger-Themen 5
M Erste Schritte [Variable] cannot be resolved to a variable Java Basics - Anfänger-Themen 4
M The Selection cannot be launched... Java Basics - Anfänger-Themen 4
M Vererbung - Cannot Find Symbol constructor... Java Basics - Anfänger-Themen 11
D error: cannot find symbol Java Basics - Anfänger-Themen 3
B Frage zu Beispielprogramm: "error: cannot find symbol" Java Basics - Anfänger-Themen 2
M Methoden Cannot be resolved to a variable Java Basics - Anfänger-Themen 5
BlueMountain Erste Schritte error: cannot find symbol Java Basics - Anfänger-Themen 2
P enum: cannot be resolved to a type Java Basics - Anfänger-Themen 2
W Compiler-Fehler "non-static method cannot be referenced"-Problem Java Basics - Anfänger-Themen 6
L Error: Cannot find symbol Java Basics - Anfänger-Themen 1
W int cannot be dereferenced Java Basics - Anfänger-Themen 5
P Cannot find Symbol Java Basics - Anfänger-Themen 3
K Compiler-Fehler Button cannot be resolved or is not a field Java Basics - Anfänger-Themen 6
F Methoden Cannot refer to a non-final variable.. verständnisproblem. Java Basics - Anfänger-Themen 7
A Cannot make a static reference to the non-static field Java Basics - Anfänger-Themen 6
K The Java Runtime Environment cannot be found. Java Basics - Anfänger-Themen 6
F Input/Output IOTools Fehlermeldung: cannot be resolved Java Basics - Anfänger-Themen 16
L Cannot Find Symbol - Was soll denn das bedeuten?!? Java Basics - Anfänger-Themen 7
P StdIn.readDouble: cannot find symbol Java Basics - Anfänger-Themen 7
B Fehler "Cannot find symbol - variable number1" Java Basics - Anfänger-Themen 13
P Variablen Cannot be resolved to a variable Java Basics - Anfänger-Themen 8
B Compiler-Fehler cannot find symbol Java Basics - Anfänger-Themen 6
K Date cannot be cast to java.lang.Integer Java Basics - Anfänger-Themen 4
M Methoden "Non-static method xy cannot be referenced from a static context" Java Basics - Anfänger-Themen 20
T Cannot convert from Integer to int Java Basics - Anfänger-Themen 12
K Cannot find symbol Java Basics - Anfänger-Themen 3
H cannot find symbol Java Basics - Anfänger-Themen 4
K Objekt erstellen - error: non-static variable this cannot be referenced from a static context Java Basics - Anfänger-Themen 17
S cannot find symbol, symbol: constructor Java Basics - Anfänger-Themen 2
3 Compiler-Fehler Fehlerbehebung cannot find Symbol Java Basics - Anfänger-Themen 4
R Compiler-Fehler Cannot find symbol (Method printIn) Java Basics - Anfänger-Themen 3
H non-static method cannot be referenced from a static context Java Basics - Anfänger-Themen 2
M Meldung "cannot convert flom boolean to boolean[]" Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben