Methoden u Objekte

chk1102

Aktives Mitglied
Hallo Zusammen,

ich brauche dringend Hilfe 🙁
Ich notiere erst die Aufgabe und dann meinen Lösungsansatz.

Folgendes muss ich lösen:
Programmieren Sie eine Klasse mit dem Namen Partei unter Beachtung der
nachfolgenden Vorgaben:
Es werden drei Instanzvariablen benötigt:
- eine zur Aufnahme des Namens der Partei,
- eine zur Aufnahme der der Partei zugewiesenen Listennummer,
- eine zur Führung der auf die Partei entfallenen Stimmen.
Die Klasse soll über eine Konstruktor-Methode verfügen. Dieser sollen der Parteiname
und die zugewiesene Listennummer als Parameter übergeben werden, die als Werte der
Instanzvariablen zu übernehmen sind. Die Anzahl der auf die Partei entfallenen Stimmen
ist auf den Anfangswert 0 zu setzen.
Zur Aktualisierung der auf eine Partei entfallenen Stimmen dient eine parameterlose
Methode mit dem Namen zustimmung, die den Wert der von der Partei erhaltenen
Stimmen um 1 erhöht.
Daneben soll die Klasse für jede Instanzvariable über eine parameterlose get-Methode
verfügen, mit deren Hilfe von einem Objekt der Klasse der aktueller Wert der betreffenden
Variablen abgerufen werden kann.


Ich Glaube das ich das geschafft hab:
Java:
import java.io.ObjectInputStream.GetField;


public class Partei {

	private static String Pname;
	private static int Listennummer;
	private static int anzStimmen = 0;
	
	public Partei(String name, int liste){
		this.Pname = name;
		this.Listennummer = liste;
	}
	
	public static int zustimmung(){
		int stimme = getanzStimmen();
		stimme++;
		return stimme;
	}
	public String getPname(){
		return Pname;
	}
	public int getListennummer(){
		return Listennummer;
	}
	public static int getanzStimmen(){
		return anzStimmen;
	}
	
}

Der zweite Teil lautet:
Programmieren Sie eine Klasse mit dem Namen Wahlmaschine, die über eine main-
Methode verfügt und direkt aufgerufen werden kann.

Die main-Methode soll nacheinander die Methoden vorbereiten, waehlen und auswerten
aufrufen. Diese drei Methoden sollen sich der Methoden der Klasse Partei aus Aufgabe 2
bedienen.

Da sich drei Parteien zur Wahl stellen, soll in der Methode vorbereiten für die Listennummern
1 bis 3 vom Benutzer jeweils der Name der betreffenden Partei erfragt werden und
ein Partei-Objekt erzeugt werden.

In der Methode waehlen soll in einer Schleife immer ein Wählervotum abgefragt werden
(„Auf welchen Listenplatz soll die Stimme entfallen? 1,2 oder 3?“), anschließend soll die
entsprechende Eingabe des Benutzers entgegengenommen werden und die Methode
zustimmung des betreffenden Partei aufgerufen werden. Bei Eingabe von 99 soll der
Wahlvorgang beendet werden, die Eingabe von Werten ungleich 1,2,3 oder 99 als
ungültige Stimme abgewiesen werden.

Nach Beendigung des Wahlvorgangs ist die Methode auswerten aufzurufen, die für die
drei Parteien deren Listennummer, den Parteinamen, die Anzahl der erhaltenen Stimmen
sowie den prozentualen Stimmenanteil zur Anzeige bringen soll.



Meine bisherige Lösung:
Java:
public class Wahlmaschine {


	public static void vorbereiten() {
		System.out.println("Bitte Name eingeben:");
		String Pnamen= EAM.rString();
		System.out.println("Bitte Name eingeben:");
		String Pnamen2 = EAM.rString();
		System.out.println("Bitte Name eingeben:");
		String Pnamen3 = EAM.rString();
		Partei p1 = new Partei(Pnamen, 1);
		Partei p2 = new Partei(Pnamen2, 2);
		Partei p3 = new Partei(Pnamen3, 3);
	}
	
	public static void waehlen(){
		System.out.println("Listenplatz? 1,2,3??");
		int liste = EAM.rInt();
		if(liste == 1){
			
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
	}

}

Ich möchte auf die erstellten Objekte zugreifen, damit die Methode waehlen() Stimmen hinzuzählen kann. Aber ich kann nicht drauf zugreifen. Bisher habe ich immer mit Objekten gearbeitet, die in der Main erzeugt wurden. Oder habe ich die Aufgabe missverstanden und bereits in der Methode vorbereiten was falsch gemacht????:L😱
 
Übrigens: Variablen fangen in Java klein an, Grossschreibung gibt es nur in KONSTANTEN, sonst wird wortTrennungSoGeschrieben. 😉

Das Problem ist wahrscheinlich, dass Du die Variablen pName, listennummer und anzStimmen statisch sind, d. h. alle Objekte der Klasse Partei haben genau dieselbe Variable (sie ist nur 1x vorhanden). Zustimmung sollte dementsprechend auch nicht statisch sein, da man mit statischen Methoden nur auf lokale oder statische Variablen zugreifen kann.
 
Weil's hier ja um Grundlagen geht, vielleicht noch folgende zwei Merksätze:
- Instanz- Variable/Methode -> kein static davor
- Klassen- Variable/Methode -> static davor
Warrior hat's schon geschrieben, dass die ganzen static's weg müssen, aber vielleicht wird es mit diesen beiden Merksätzen bei der Lösung zukünftiger Aufgaben leichter. Dein Prof. scheint ja glücklicherweise diese Begriffe in seinen Aufgaben zu verwenden.

Und was mir noch auffällt: Selbst nach Wegfall der ganzen static's bist Du noch nicht fertig. Die Methode
Code:
zustimmung()
erfüllt die gestellte Anforderung nicht. Sie soll nämlich: "den Wert der von der Partei erhaltenen Stimmen um 1 erhöhen". In welcher Variable wird dieser Wert gespeichert? Hinter welchen Variablennamen müsste also das "++"? Muss die Methode für die Erfüllung der Aufgabe einen return-Wert zurück geben?
 
Zuletzt bearbeitet von einem Moderator:
Fehlermeldung ist nun weg.
Mir wurde erklärt, dass wenn ein Objekt im Spiel ist die Methoden mit static deklariert werden sollen. Oder hab ich das falsch verstanden?
Daher hab ich die Methoden auch entsprechend deklariert.
Die Instanzvariablen anzStimmen usw. habe ich ebenso mit static deklariert, weil Objekt = static
Und ich war davon ausgegangen, dass final eine Variable festsetzt und nicht static...
 
Mit Static deklarierst Du Klassenvariablen/Methoden
Diese können in der Klasse nur EIN MAL existieren und müssen nicht mit NEW erzeugt werden, die sind STATISCH einfach da, sobald sie deklariert werden. Die können auch benutzt werden, ohne dass die Klasse mit new erstellt wurde.

Eine Instanzvariable/Methode (ohne Static) ist hingegen eine Variable/Methode, die für jede Instanz die Du mit NEW erstellst neu und exclusiv für diese Instanz erzeugt wird.

Pentalon
 
Vielen Dank für die Erklärung. 🙂

Die Methode vorbereiten() kann ich doch so belassen, weil sie als Klassenmethode auf die andere Klasse zugreifen muss, oder? Ich meine wegen den Objekten.


Java:
public static void vorbereiten() {
		System.out.println("Bitte Name eingeben:");
		String Pnamen= EAM.rString();
		System.out.println("Bitte Name eingeben:");
		String Pnamen2 = EAM.rString();
		System.out.println("Bitte Name eingeben:");
		String Pnamen3 = EAM.rString();
		Partei p1 = new Partei(Pnamen, 1);
		Partei p2 = new Partei(Pnamen2, 2);
		Partei p3 = new Partei(Pnamen3, 3);
	}
 
Vielen Dank für die Erklärung. 🙂

Die Methode vorbereiten() kann ich doch so belassen, weil sie als Klassenmethode auf die andere Klasse zugreifen muss, oder? Ich meine wegen den Objekten.


Java:
public static void vorbereiten() {
		System.out.println("Bitte Name eingeben:");
		String Pnamen= EAM.rString();
		System.out.println("Bitte Name eingeben:");
		String Pnamen2 = EAM.rString();
		System.out.println("Bitte Name eingeben:");
		String Pnamen3 = EAM.rString();
		Partei p1 = new Partei(Pnamen, 1);
		Partei p2 = new Partei(Pnamen2, 2);
		Partei p3 = new Partei(Pnamen3, 3);
	}

Ja, diese Methoden werden ja nur ein mal benötigt.
Bei der Partei war das anders, da brauchtest Du mehrer Instanzen der selben Klasse.
Das einzige, Deine Referenzen zu den erzeugten Parteien (p1, p2, p3), musst Du für die anderen beiden
Methoden zugänglich machen, also nicht on the Fly in der Prozedur erstellen (Thema Sichtbarkeit).

Pentalon
 
Mit Static deklarierst Du Klassenvariablen/Methoden
Diese können in der Klasse nur EIN MAL existieren

Also für mich ist ne Klasse eine Art Bauplan, nach der Objekte erstellt werden können.

Nach einem Bauplan "Klasse" erzeugte Objekte bleiben mit ihrem Bauplan verbunden, kennen also ihren Bauplan.

Klasse => Bauplan
Instanz => Objekt nach bestimmtem Bauplan

Statische Variable oder Methoden werden beim Erstellen eines entsprechenden Objekts dort nicht eingebaut, sonder bleiben Teil des Bauplans, also der Klasse. (daher Klassenvarible, -methode).
Greifen Objekte dann auf diese statischen Methoden oder Variablen zu, dann bedeutet das gewissermassen einen Rückgriff auf den Bauplan, der für alle Instanzen einer Klasse logischerweise der Gleiche ist.

Ich denke, dass gerade die Unterscheidung von Klasse und Instanz, bzw. Objekt die größte Hürde für Anfänger darstellt. Ein richtig gutes Bild für die klare Trennung der Begriffe hab ich bisher noch nicht gefunden.

"Klassenvariable und -Methoden können in der Klasse nur einmal existieren"
trägt da für mich jedenfalls zur Erklärung nicht wirklich viel bei. Aber jeder hat da ja vermutl. so sein eigenes Denkmodell..
 
In der Mehtode vorbereiten erstelle ich ja 3 Partei-Objekte.
Jetzt möcht ich sie in der nächsten Methode derselben Klasse verwenden, was aber nicht geht.

1. Warum? Weil sie noch nicht instanziiert wurde??
2. Kann ich die Objekte nicht einfach in der Main schreiben? Oder ist das nicht die Aufgabenstellung...
 
man redet hier über Sichtbarkeit von Objekten...wenn man die Objekte (in deinem Fall die 3 Parteien) in einer Methode deklariert und initialisiert, dann sind sie nur dort sichtbar...wenn du sie aber als Fields, Slots, oder Klassenvariablen deklarierst, sind sie überall sichtbar...

Java:
class Wahlmaschine {
	Partei p1, p2, p3;

	public void vorbereiten() {

		System.out.println("Bitte Name eingeben:");
		String Pnamen = EAM.rString();
		System.out.println("Bitte Name eingeben:");
		String Pnamen2 = EAM.rString();
		System.out.println("Bitte Name eingeben:");
		String Pnamen3 = EAM.rString();
		p1 = new Partei(Pnamen, 1);
		p2 = new Partei(Pnamen2, 2);
		p3 = new Partei(Pnamen3, 3);
	}

	public void waehlen() {
		System.out.println("Listenplatz? 1,2,3??");
		int liste = EAM.rInt();
		while (liste != 99) {
			
		}
	}

	public static void main(String[] args) {
		Wahlmaschine wahlmaschine = new Wahlmaschine();

		wahlmaschine.vorbereiten();
		wahlmaschine.waehlen();
		wahlmaschine.auswerten();

	}

	private void auswerten() {
		// TODO Auto-generated method stub

	}

}
 
🙂

Ich möchte jez folgendes aber machen, was leider nicht funzt:

Java:
public static void waehlen(){
		System.out.println("Listenplatz? 1,2,3??");
		int liste = EAM.rInt();
		while(liste !=99) {
			if(liste == 1){
				p1.zustimmtung();
		}
			System.out.println("Listenplatz? 1,2,3??");
			liste = EAM.rInt();
		
		}
	}

zu p1 ist das grad nur ein Beispiel
 
Eclipse bot mir grad an die p1 Instanzvariable als Static zu schreiben:
static Partei p1;
Partei p2, p3;


dann nimmt die Methode meinen p1.zustimmung(); - Vorschlag an
Java:
public static void waehlen(){
		System.out.println("Listenplatz? 1,2,3??");
		int liste = EAM.rInt();
		while(liste !=99) {
			if(liste == 1){
				p1.zustimmung();
		}
			System.out.println("Listenplatz? 1,2,3??");
			liste = EAM.rInt();
		
		}
	}


Aber warum,...nicht zuletzt bed statisch = unveränderbar
 
vergiss diese ganze statische Sch...

wo ist das Problem, dein Wahlprogramm soll solange Stimmen "einsammeln" bis jemand 99 eigibt...=>
irgendeine Schleife, die solange Stimmen hochzählt, bis 99 eingeben wird.

Zeig doch mal gerade deinen Stand, also sowohl die Parteiklasse, als auch die Wahlmaschienenklasse.
 
okidoki.. Problem,...keine Ahnung... Bei den ÜB zu denen es ur 1 Klasse gab, hatte ich keine Probleme

Java:
public class Wahlmaschine {
     Partei p1;
	 Partei p2, p3;


	public void vorbereiten() {
		System.out.println("Bitte Name eingeben:");
		String Pnamen= EAM.rString();
		System.out.println("Bitte Name eingeben:");
		String Pnamen2 = EAM.rString();
		System.out.println("Bitte Name eingeben:");
		String Pnamen3 = EAM.rString();
		Partei p1 = new Partei(Pnamen, 1);
		Partei p2 = new Partei(Pnamen2, 2);
		Partei p3 = new Partei(Pnamen3, 3);
	}
	
	public void waehlen(){
		System.out.println("Listenplatz? 1,2,3??");
		int liste = EAM.rInt();
		while(liste !=99) {
			if(liste == 1){
				p1.zustimmung();
		}
			if(liste == 2){
				p2.zustimmung();
		}
			if(liste == 3){
				p3.zustimmung();
		}
			System.out.println("Listenplatz? 1,2,3??");
			liste = EAM.rInt();
		
		}
	}
	
	public void auswerten(){
		p1.getanzStimmen();
		p1.getPname();
		p1.getListennummer();
		
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Wahlmaschine myM = new Wahlmaschine();
		myM.vorbereiten();
		myM.waehlen();
		myM.auswerten();
		
		
	}

}

Java:
import java.io.ObjectInputStream.GetField;


public class Partei {

	private String Pname;
	private int Listennummer;
	private int anzStimmen;
	
	public Partei(String name, int liste){
		this.Pname = name;
		this.Listennummer = liste;
		anzStimmen = 0;
	}
	
	public void zustimmung(){
		++this.anzStimmen; 
	}
	public String getPname(){
		return Pname;
	}
	public int getListennummer(){
		return Listennummer;
	}
	public int getanzStimmen(){
		return anzStimmen;
	}
	
}

Alle Statics weg.


Bitte Name eingeben:
cdu
Bitte Name eingeben:
sdp
Bitte Name eingeben:
grüne
Listenplatz? 1,2,3??
1
Exception in thread "main" java.lang.NullPointerException
at Wahlmaschine.waehlen(Wahlmaschine.java:24)
at Wahlmaschine.main(Wahlmaschine.java:50)
 
ok, damit dieser statische Mist mal ein Ende hat...bzw. du kapierst, was statisch und was eine Instanzvariable ist, habe ich in der Klasse Partei mal eine statische Variable eingefügt.
Diese macht auch Sinn, denn diese statische Variable zählt bspw. die gültigen gesamtStimmen aller Parteien hoch:

Java:
public class Partei {

	private String parteiName;
	private int listenNummer;
	private int anzStimmen = 0;
	private static int gesamtAnzahlAnStimmen = 0;

	public Partei(String name, int liste) {
		this.parteiName = name;
		this.listenNummer = liste;
	}

	public void zustimmung() {
		anzStimmen++;
		gesamtAnzahlAnStimmen++;
	}

	public String getPname() {
		return parteiName;
	}

	public int getListennummer() {
		return listenNummer;
	}

	public int getanzStimmen() {
		return anzStimmen;
	}

	public static int getGesamtAnzahlAnStimmen() {
		return gesamtAnzahlAnStimmen;
	}

}

und wenn du dann auch in der vorbereiten-Methode die außerhalb der vorbereiten-Methode deklarierten Variablen nehmen würdest, würde auch die NPE wegfallen...

also =>
[java=6] public void vorbereiten() {
...
p1 = new Partei(Pnamen, 1);
p2 = new Partei(Pnamen2, 2);
p3 = new Partei(Pnamen3, 3);
}
[/code]
also ohne Partei davor, weil sonst sind das neue Variablen, die nur in der vorbereiten()-Methode gültig sind und deine Instanzvariablen sind weiterhin null
 
Zuletzt bearbeitet:

Zurück
Oben