Eingabe Überprüfung von Klassen-Objekten

dzyan

Mitglied
Hi !

Ich möchte gerne User-Eingaben auf Vorhanden-Sein überprüfen.


public class DrehFB
{
// Attribute:
public String mannschaft;
public int spiele;
public int freispiele;
public int aus;
public int gTore;
public int bTore;
public int torDiff;
public int punkte

// Konstruktor
public DrehFB(String m, int s, int fs, int a, int g, int b, int t, int p)
{
mannschaft = m;
spiele = s;
freispiele = fs;
aus = a;
gTore = g;
bTore = b;
torDiff = t;
punkte = p;
}

static DrehFB[] mannschaften = new DrehFB[MANNSCHAFTEN_MAX];

<main-method>

Scanner eingabe1 = new Scanner(System.in);
String ausw1 = eingabe1.next();

Scanner eingabe2 = new Scanner(System.in);
String ausw2 = eingabe2.next();


if (ausw1.contains(mannschaft) && ausw2.contains(mannschaft))
...

Sollte normal funktionieren, schreibt aber eine Fehler-Meldung:
Cannot make a static referenz to a non-static-referenz

Wenn ich die Attibute aber auf static ändere, dann steht auf einmal bei allen Mannschaften das gleiche drinnen, wenn man diese ausgibt ?

Aber vielleicht überprüft man Eingaben (ob vorhanden oder nicht) sowieso anders ?


Danke im voraus.


LG
Dzyan
 
Hi.
<main-method>

Scanner eingabe1 = new Scanner(System.in);
String ausw1 = eingabe1.next();

Scanner eingabe2 = new Scanner(System.in);
String ausw2 = eingabe2.next();


if (ausw1.contains(mannschaft) && ausw2.contains(mannschaft))
...

Sollte normal funktionieren, schreibt aber eine Fehler-Meldung:
Cannot make a static referenz to a non-static-referenz
Nein, das kann nicht funktionieren. Du benötigst 2 Instanzen der DrehFB Klasse:
Java:
DrehFB a = new DrehFB(...);
DrehFB b = new DrehFB(...);

if (ausw1.contains(a.mannschaft) && ausw2.contains(b.mannschaft)) {
  ...
}
Außerdem ist es ziemlich unüblich und verletzt das Prinzip der Datenkapselung bei der objektorientierten Programmierung die Attribute einer Klasse als public zu deklarieren.

Gruß

PS: Bitte verwende die Code-Tags!
 
Wenn ich die ganzen Attribute als static declariere, dann steht überall der letzte
Datensatz drinnen

ZB:
Code:
public class DrehFB
{
	// Attribute:
	static String mannschaft;
	static int spiele;
	static int freispiele;
	static int aus;
	static int gTore;
	static int bTore;
	static int torDiff;
	static int punkte;

DrehFB[] mannschaften = new DrehFB[MANNSCHAFTEN_MAX];
 
mannschaften[0] = new DrehFB(0, "Team1", 2, 3, 1, 2, 3);
mannschaften[1] = new DrehFB(1, "Team2", 2, 3, 1, 2, 5);
mannschaften[2] = new DrehFB(2, "Team3", 2, 3, 1, 2, 1);
mannschaften[3] = new DrehFB(3, "Team4", 2, 3, 1, 2, 4);

Die Mannschaften werden aber über Tastatur eingegeben, damit stimmt das
Programm so nicht ganz.

Aber wenn ich das so mache (über Tastatur), dann steht bei jeder Mannschaft das gleiche
drinnen (bei static-Attributen), wenn man das ausgibt - nicht mehr wie oben, sondern:

Code:
mannschaften[0] = ("Team4", 2, 3, 1, 2, 4);
mannschaften[1] = ("Team4", 2, 3, 1, 2, 4);
mannschaften[2] = ("Team4", 2, 3, 1, 2, 4);
mannschaften[3] = ("Team4", 2, 3, 1, 2, 4);

Deswegen public ...
 
Zuletzt bearbeitet:
Wenn ich die ganzen Attribute als static declariere, dann steht überall der letzte
Datensatz drinnen
Wer hat denn gesagt du sollst die Attribute statisch deklarieren? :confused:

Es macht keinen Sinn die Attribute als static zu deklarieren. Natürlich sind dann alle Werte gleich, es sind ja dann auch Klassenattribute. Du solltest den Zugriff nicht public machen, sondern private. Auf die Attribute einer Klasse sollte man ausschließlich über Getter/Setter-Methoden zugreifen können - also für ein Attribute "name" 2 Methoden getName() und setName() implementieren.

Gruß
 
Zuletzt bearbeitet:
Hallo,

DeeptTHroat hat Recht..deklariere die Attribute als 'private' und bau dir Getter- und Setter-Methoden dafür...
Und wenn du mehrere Instanzen deiner Klasse in einem Container speichern möchtest, kannst du das zwar in in einem statischen Attribut - du musst dann aber einen statischen Index führen, um zu wissen wo du das nächste Element einfügen möchtes; auch ist ein Array nur dann sinnvoll wenn du genau weißt mit wievielen Elementen zu rechnen ist - machen, besser wäre es aber deine Klasse damit nicht zu belasten, sondern daß von den Teilen erledigen zu lassen die sie benutzen sollen...

Schönen Abend

Alexander Schell
 
Da habt Ihr sicher recht mit public, static und private - nur löst weder das eine noch das andere das Problem:

Code:
public String get_ms()
{
return this.mannschaft;
}

static void mannschaftenEingeben(int mNr)
{ ... es werden hier die Mannschaften nur von der Tastatur eingeben ...}


Code:
static void spielergenisseEingeben(int mNr)
{
try
{
System.out.println();
System.out.print("1. Mannschaft eingeben: ");
Scanner eingabe1 = new Scanner(System.in);
String ausw1 = eingabe1.next();
				
System.out.print("2. Mannschaft eingeben: ");
Scanner eingabe2 = new Scanner(System.in);
String ausw2 = eingabe2.next();
						
if (ausw1.contains(mannschaft) && ausw2.contains(mannschaft))
...

FehlerCode:
Cannot make a static referenz to an non-static-field mannschaft ...

oder:

Code:
if (ausw1.contains(get_ms()) && ausw2.contains(get_ms()))
...

FehlerCode:
Cannot make a static referenz to an non-static-method get_ms() from type DrehFB ...
 
Hallo,

das ist kein Wunder...
Du versuchtst aus einem statischen Kontext heraus ein Objekt-Attribut - 'mannschaft' - anzusprechen; das geht nicht.


Schönen Abend

Alexander Schell
 
Du benötigst 2 Instanzen der DrehFB Klasse...

Ich habe viele Instanzen der Klasse (je nachdem wie viele Mannschaften es sind):
5 oder 6 oder 9 oder 14 oder 16 oder ...

Code:
mannschaften[mNr] = new DrehFB();

Aus a und b werde ich nicht schlau ?
Es müssen bei der 1.Auswahl mit allen vorhandenen Mannschaften verglichen werden, die es gibt
und das selbe auch für die 2. Auswahl...

Deshalb ist das Ganze für mich etwas schwierig...
 
Zuletzt bearbeitet:
Zurück