Variable von Objekten in einer Methode überprüfen

TFRLucky

Mitglied
Hi, ich würde gerne wissen, wie ich überprüfen wie viele Objekte eingeschaltet sind:
Java:
public class Application {
    public static void main(String[]args){
        Radio r1 = new Radio();
        Radio r2 = new Radio();
        IceMachine ice = new IceMachine();
        Ship.devices.add(r1);
        Ship.devices.add(r2);
        Ship.devices.add(ice);
        r1.on();
        r2.on();
        ElectronicDevice.numberOfElectronicDevicesSwitchedOn(r1, r2, ice);
        Ship.countDevicesSwitchedOn();
    }
}
In der Klasse Application werden meiner Objekte der Klasse ElectronicDevice:
Code:
public class ElectronicDevice {
    static boolean isOn = false;

    public void on() {
        isOn = true;
        System.out.println("An");
    }

    public void off() {
        isOn = false;
        System.out.println("Aus");
    }


    public static int numberOfElectronicDevicesSwitchedOn(ElectronicDevice... devices) {
        int x = 0;
        if (isOn) {
            x++;
        }


        System.out.println(x);
        return x;
    }
}
erstellt. Wie überprüfe ich jetzt, welche Objekte eingeschaltet sind?
 

KonradN

Super-Moderator
Mitarbeiter
Deine Frage verstehe ich nicht. Du hast doch schon einen gewissen Code geschrieben. Wenn der nicht das macht, was Du möchtest, dann solltest Du den Fehler beschreiben.

Ansonsten solltest Du Dir einmal anschauen, was das Schlüsselwort static macht - speziell bei der Variable isOn.
 

TFRLucky

Mitglied
Hi, danke für die schnelle Antwort. Das Problem welches ich habe, ist, dass ich eine nicht statische Variable nun mal nicht in einer statischen Methode abfragen kann. "numberOfElectronicDevicesSwitchedOn" muss aber static sein, damit ich die Methode in der main Methode von Application aufrufen kann. Das Programm gibt mir aus, dass nur 1 Gerät an ist. Wie sorge ich also dafür, dass jedes Objekt einzeln überprüft wird?
 

KonradN

Super-Moderator
Mitarbeiter
Hi, danke für die schnelle Antwort. Das Problem welches ich habe, ist, dass ich eine nicht statische Variable nun mal nicht in einer statischen Methode abfragen kann. "numberOfElectronicDevicesSwitchedOn" muss aber static sein, damit ich die Methode in der main Methode von Application aufrufen kann. Das Programm gibt mir aus, dass nur 1 Gerät an ist. Wie sorge ich also dafür, dass jedes Objekt einzeln überprüft wird?
Du hast in einer statischen Methode nicht die Instanz this. Aber die brauchst du doch auch nicht. Du willst doch die Geräte prüfen, die als Parameter übergeben worden sind. Mit ElectronicDevice... devices hat Du ein ein vararg mit ElectronicDevice Instanzen. Auf diese kannst Du in der Methode zugreifen um deren isOn zu prüfen.
 

TFRLucky

Mitglied
Die Methode sieht jetzt so bei mir aus:
Code:
public static int numberOfElectronicDevicesSwitchedOn(ElectronicDevice... devices) {
        int x = 0;
        for(int i = 0; i < devices.length; i++) {
            if (ElectronicDevice.isOn) {
                x++;
            }
        }


        System.out.println(x);
        return x;
    }
Mit der for schleife will ich überprüfen wieviele Instanzen übergeben wurden. Dann frage ich mit if ab ob isOn von der Instanz true ist. Aber die Ausgabe gibt immer an, dass alle on sind auch wenn ich nur eine Instanz on ist
 

KonradN

Super-Moderator
Mitarbeiter
Dann kommen wir noch einmal auf den ersten Punkt von mir zurück: Was ändert sich denn durch das static bei isOn?
 

TFRLucky

Mitglied
Ja, ich weiß, dass static die Variable für die ganze Klasse speichert. Wie kann ich aber eine nicht statische Variable in einer statischen Methode überprüfen?
 

KonradN

Super-Moderator
Mitarbeiter
Ja, ich weiß, dass static die Variable für die ganze Klasse speichert. Wie kann ich aber eine nicht statische Variable in einer statischen Methode überprüfen?
Du hast das schlicht falsch verstanden. Um eine nicht statische Variable nutzen zu können brauchst Du eine Instanz der Klasse. Das ist die wichtige Aussage.

In einer statischen Methode hast du nicht die Instanz "this". Somit kannst Du nicht auf this zugreifen (und somit auch nicht auf Alles, was verkürzt für this.xxxx steht).

Aber natürlich kannst Du auf die Variable zugreifen, wenn Du eine Instanz hast (und die Zugriffsrechte es erlauben).

Also probiere es doch einfach aus.
 

TFRLucky

Mitglied
Wenn ich isOn zu einer non-static Variable mache und ich über ElectronicDevice.isOn auf sie zugreifen kommt die Fehlermeldung: "Non-static field 'isOn' cannot be referenced from a static context", obwohl ich in meiner main Methode 3 Instanzen der Klasse ElectronicDevice erstellt habe
 

KonradN

Super-Moderator
Mitarbeiter
Wenn ich isOn zu einer non-static Variable mache und ich über ElectronicDevice.isOn auf sie zugreifen kommt die Fehlermeldung: "Non-static field 'isOn' cannot be referenced from a static context", obwohl ich in meiner main Methode 3 Instanzen der Klasse ElectronicDevice erstellt habe
Ja, das ist auch richtig. Wenn Du es zu einer Instanzvariable machst, dann kannst Du nicht mehr über die Klasse zugreifen.

Daher ist da also immer noch etwas falsch in der Methode. Wir drehen uns hier massiv im Kreis:

a) Du hast mehrere Gegenstände und die Gegenstände haben einen Status. In Deinem Fall soll das ein Flags ein: isOn.
Das muss dann doch eine Sache sein, die in jedem Gegenstand ist. Jedes einzelne elektrische Gerät kann an oder aus sein. Unabhängig von allen anderen elektrischen Geräten. Eine globale Variable, die genau ein einziges Mal existiert, macht also absolut keinen Sinn, oder?

b) Wenn Du wissen willst, wie voll der Tank von irgendwelchen Autos ist: Wo schaust Du dann nach? Fragst Du beim Hersteller nach damit der dann mal auf dem Bauplan nachschaut? Wo findet sich der Tankinhalt der Autos?

Wenn Du sowas baust, dann bau es immer ein Schritt nach dem anderen:

Als erstes Bildest Du das ab, was abgebildet sein soll. Ein elektrisches Gerät soll eingeschaltet sein können. Dann machst Du dies. Das wäre der Punkt a.

Wenn Du das fertig hast, dann kannst Du es testen. Du kannst also etwas machen wie:
Java:
Radio radio1 = new Radio();
Radio radio2 = new Radio();
assert(!radio1.isOn);
assert(!radio2.isOn);
radio1.on();
assert(radio1.isOn);
assert(!radio2.isOn);

Dann kannst Du eine Methode schreiben wie dein statische Methode. Und da kannst Du Dir dann in Ruhe überlegen, worauf Du eigentlich zugreifen willst und so.
 

Neumi5694

Top Contributor
Wenn ich isOn zu einer non-static Variable mache und ich über ElectronicDevice.isOn auf sie zugreifen kommt die Fehlermeldung: "Non-static field 'isOn' cannot be referenced from a static context", obwohl ich in meiner main Methode 3 Instanzen der Klasse ElectronicDevice erstellt habe
Es geht letztendlich um die Frage, was die Variable beschreiben soll: Soll isOn den Status eines spezfischen ElectronicDevices beschreiben oder den Status ALLER Devices?
Falles um alle geht, dann ist statisch ok, dann können die verschiedenen Devices aber auch nicht verschiedene Werte haben.

Falls du jedes Device einzeln beschreiben willst, dann muss es eine nicht statische Instanzvariable sein.

Dann allerdings musst du auch sagen, welches Device dich nun interessiert, wenn du darauf zugreifst.
Gib einfach an, um welches Device es geht, dann klappt auch der nicht statische Zugriff (so wie es auch gedacht ist).

Statische Variable:
Device.IsOn(); //alles, was ein Device ist, ist on

Nicht statische Instanzvariable:
Device thisDevice = new Device();
thisDevice.isOn(); //dieses eine Device ist on.
 

TFRLucky

Mitglied
Also muss ich immer händisch in die Methode rein gehen und immer wenn ich eine Instanz hinzugefügt habe die Instanz in der Methode berücksichtigen?
Java:
static ElectronicDevice r1 = new ElectronicDevice();
    static ElectronicDevice r2 = new ElectronicDevice();
    static ElectronicDevice ice = new ElectronicDevice();

    public static int numberOfElectronicDevicesSwitchedOn(ElectronicDevice... devices) {
        int x = 0;
        for(int i = 0; i < devices.length; i++) {
            if (ElectronicDevice.r1.isOn) {
                x++;
            }
            if (ElectronicDevice.r2.isOn) {
                x++;
            }
            if (ElectronicDevice.ice.isOn) {
                x++;
            }

        }

        return x;
    }
 

KonradN

Super-Moderator
Mitarbeiter
Nein! Vergiss endlich das static. Du brauchst absolut nichts mit static! Und vor allem solltest Du aufhören so zu raten.

Überlege doch erst einmal, was die Methode public static int numberOfElectronicDevicesSwitchedOn(ElectronicDevice... devices) machen soll. Kannst Du das in Worten beschreiben?
 

KonradN

Super-Moderator
Mitarbeiter
Die Methode soll jede Insatnz auf isOn überfrüfen und zurück geben bei wieviel isOn true ist
Das ist eine pauschale Aussage, mit der niemand etwas anfangen kann weil einfach zu ungenau.

Wenn Du so eine Methode beschreiben willst, dann betrachte immer die Eingabe und sag, was mit der Eingabe passieren soll um dann zu einer Ausgabe zu kommen.

Fangen wir bei der Eingabe an: Was für eine Eingabe hat denn die Methode?
 

TFRLucky

Mitglied
Der Methode werden beliebig viele Instanzen übergeben. Dann soll die Methode für jede der übergebenen Instanzen überprüfen ob isOn true ist und wiedergeben.
 

KonradN

Super-Moderator
Mitarbeiter
Der Methode werden beliebig viele Instanzen übergeben. Dann soll die Methode für jede der übergebenen Instanzen überprüfen ob isOn true ist und wiedergeben.
Ja, so klingt das schon viel besser.

Dann wäre die nächste Frage: Wie kannst Du denn bei so einem varargs Parameter auf die Instanzen zugreifen?

Das evtl. direkt bei dem Code der Methode aus #5 einbauen :)
 

Neumi5694

Top Contributor
(kleiner Tip: Das Geheimnis, wie man auf eine Instanz zugreift, ist: Anstatt des Klassennamens die Variable verwenden, die auf die Instanz verweist).
 

TFRLucky

Mitglied
Wenn ich die Methodeso schreibe:
Java:
public static int numberOfElectronicDevicesSwitchedOn(ElectronicDevice... devices) {
        int x = 0;
        for(int i = 0; i < devices.length; i++) {
            if (ElectronicDevice.isOn) {
                x++;
            }

        }

        return x;
    }
}
kommt der Fehlercode "Non-static field 'isOn' cannot be referenced from a static context", ich weiß aber leider nicht, wie ich sonst auf alle Instanzen zugreifen soll
 

Neumi5694

Top Contributor
Wenn ich die Methodeso schreibe:
Java:
public static int numberOfElectronicDevicesSwitchedOn(ElectronicDevice... devices) {
        int x = 0;
        for(int i = 0; i < devices.length; i++) {
            if (ElectronicDevice.isOn) {
                x++;
            }

        }

        return x;
    }
}
kommt der Fehlercode "Non-static field 'isOn' cannot be referenced from a static context", ich weiß aber leider nicht, wie ich sonst auf alle Instanzen zugreifen soll
Was lässt dich glauben, dass ElectronicDevice "alle Instanzen" ist? Das ist genau gar keine Instanz, das ist eine Klasse.

Du hast in deinem Quellcode eine Aufzählung aller Instanzen. Finde sie. Dann greife auf die einzelnen Elemente dieser Aufzählung zu.


MyClass myClassInstance1 = new MyClass();
MyClass myClassInstance2 = new MyClass();

myClassInstance1 und myClassInstence2 sind Instanzen.
MyClass ist keine Instanz und schon gar nicht "alle Instanzen". MyClass liefert Eigenschaften der Klasse, mehr nicht.
 

TFRLucky

Mitglied
Meine nächste Idee wäre gewesen:
Java:
public static int numberOfElectronicDevicesSwitchedOn(ElectronicDevice... devices) {
        int x = 0;
        for(int i = 0; i < devices.length; i++) {
            if (devices.isOn) {
                x++;
            }

        }

        return x;
    }
weil devices steht ja für die Instanzen die ich hinzufüge. Aber jetzt kommt der Fehlercode "Cannot resolve symbol 'isOn'"
 

KonradN

Super-Moderator
Mitarbeiter
Hast Du mal geschaut, wie Du auf die varargs Argumente zugreifen kannst?

Teilweise hast Du da ja schon einen Zugriff ... dieses devices.length ... was ist denn devices, dass es da ein length gibt?
 

Neumi5694

Top Contributor
Meine nächste Idee wäre gewesen:
Java:
public static int numberOfElectronicDevicesSwitchedOn(ElectronicDevice... devices) {
        int x = 0;
        for(int i = 0; i < devices.length; i++) {
            if (devices.isOn) {
                x++;
            }

        }

        return x;
    }
weil devices steht ja für die Instanzen die ich hinzufüge. Aber jetzt kommt der Fehlercode "Cannot resolve symbol 'isOn'"
Handelt es sich bei devices um ein einzelnes Element? Nein, devices ist eine Auflistung von Elementen, oder genauer gesagt: ein Array. Hat eine Auflistung denn eine isOn-Eigenschaft? Ich glaube nicht, Tim.
Also ... wie greift man denn auf ein einzelnes Element eines Arrays zu?

Kleiner Tip:
Wenn du viele Zettel in einer Box hast und das Wort wissen willst, das auf Zettel Nr. 3 geschrieben steht, was musst du dann tun? Du nimmst den dritten Zettel aus der Box und liest ihn.
Mach das gleiche in Jave mit einem Array von ElectronicDevices.
 

mihe7

Top Contributor
Richtig, der Vollständigkeit halber sei hier noch die for-each-Schleife (offiziell "enhanced for statement") erwähnt, mit der Du das, was Du möchtest noch etwas prägnanter ausdrücken und Dir den Index zugleich auch noch sparen kannst:
Java:
int count = 0;
for (ElectronicDevice device : devices) { // für jedes device aus devices wiederhole...
    if (device.isOn) {
        count++;
    }
}
return count;

Die Stream-Variante erspare ich uns :cool:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Y Variable Menge von Objekten erzeugen und mit ihren Attributen rechnen Java Basics - Anfänger-Themen 7
M Länge eines Arrays als Variable speichern möglich? Java Basics - Anfänger-Themen 14
R Liste in Variable speichern Java Basics - Anfänger-Themen 6
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
E Variable von 1. Fenster an 2. Fenster übergeben. Java Basics - Anfänger-Themen 7
T Variable in Schleife deklarieren, Speicherplatz, Garbage Collector Java Basics - Anfänger-Themen 10
T Datum als Variable wert Java Basics - Anfänger-Themen 4
G Variable aktualisiert sich nicht in rekursiver Methode Java Basics - Anfänger-Themen 4
R Compiler-Fehler Variable wird nicht gefunden bzw. erkannt? Java Basics - Anfänger-Themen 2
Say super.methode / super.variable und super(variable) Java Basics - Anfänger-Themen 2
M variable in anderer funktion aufrufen Java Basics - Anfänger-Themen 10
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
U Wie mache ich die Variable xyz eindeutig/unique? Java Basics - Anfänger-Themen 20
JordenJost char variable funktioniert irgendwie nicht a+b ergibt nicht à Java Basics - Anfänger-Themen 4
M Variable Felderanzahl Java Java Basics - Anfänger-Themen 10
T Variable durch Action Listener ändern Java Basics - Anfänger-Themen 2
stormyark Fehler beim überschreiben einer Variable Java Basics - Anfänger-Themen 1
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
M Variable in einer Schleife initialisieren Java Basics - Anfänger-Themen 46
W Schleife und einmal variable++ zu viel Java Basics - Anfänger-Themen 20
M String mit Variable vergleichen Java Basics - Anfänger-Themen 9
M Methoden Wert einer Variable geht verloren? Java Basics - Anfänger-Themen 6
G variable kopieren bzw. woanders benutzen Java Basics - Anfänger-Themen 6
Ameise04 Variablen Inhalt einer Variable im Code verwenden? Java Basics - Anfänger-Themen 9
J Double Variable und Addition Java Basics - Anfänger-Themen 2
I Variable innerhalb Methode: Local variable test defined in an enclosing scope must be final or effectively final Java Basics - Anfänger-Themen 3
KogoroMori21 Variable im Parameter und Ohne Java Basics - Anfänger-Themen 5
Vivien Auf eine Variable von einer anderen Klasse aus zugreifen Java Basics - Anfänger-Themen 3
H Datentypen Wertebereich von <Klassenname> <Variable> Java Basics - Anfänger-Themen 12
M Private Variable Java Basics - Anfänger-Themen 2
idontknow707 Matrix nach z.B. Variable durchsuchen Java Basics - Anfänger-Themen 4
T Variable in for Schleife ansprechen ohne Array ? Java Basics - Anfänger-Themen 25
s.marcii Modulo in der Variable einsetzen - ist das möglich? Java Basics - Anfänger-Themen 2
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
Y Wie kann ich die Variable in der Try Catch returnen? Java Basics - Anfänger-Themen 3
K Übergabe des Wertes einer Variable aus main() in eine Klassenmethode Java Basics - Anfänger-Themen 8
B Inkrement von Variable Java Basics - Anfänger-Themen 8
V Variablen statische Variable einer Objektvariable zuordnen Java Basics - Anfänger-Themen 3
L Variable von einer Methode zu einer anderen Methode inkl. einer "Zwischenmethode" Java Basics - Anfänger-Themen 1
J JTextField Bezeichnung als Variable Java Basics - Anfänger-Themen 3
N Wie kann ich eine meine Variable Final machen? Java Basics - Anfänger-Themen 1
NeoLexx Variable für Array wird nicht korrekt übergeben Java Basics - Anfänger-Themen 45
M Enum-Variable HashMap zuweisen Java Basics - Anfänger-Themen 5
H Variable um 1 erhört ausgeben Java Basics - Anfänger-Themen 4
V Erste Schritte Eine Array-Variable mit Benutzereingaben befüllen 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
A Wie zwei zahlen in einer Variable speichern? Java Basics - Anfänger-Themen 7
W Problem mit dem Wert von boolean-Variable Java Basics - Anfänger-Themen 3
M Input/Output JTextField Eingabe in String Variable speichern Java Basics - Anfänger-Themen 15
A Kann man eine Methode als Variable speichern und danach noch verändern? Java Basics - Anfänger-Themen 6
L cannot find symbol variable Kon Java Basics - Anfänger-Themen 8
C Statischer Typ aber Variable nicht statisch? Java Basics - Anfänger-Themen 5
H Variable.methode aufstellen, verstehen Java Basics - Anfänger-Themen 2
R Warnung, wenn eine Variable eingegeben wird Java Basics - Anfänger-Themen 6
S Variable einscannen Java Basics - Anfänger-Themen 30
N Best Practice Rückgabe eines Terminal Befehls in eine Variable speichern Java Basics - Anfänger-Themen 27
M Erste Schritte Mit Variable verschiedene Texte in Textfeld einfügen Java Basics - Anfänger-Themen 27
J Input-Variable nicht sichtbar Java Basics - Anfänger-Themen 2
L Warum ist Variable null? Java Basics - Anfänger-Themen 3
E Variable (Vektor) in andere Methode übergeben Java Basics - Anfänger-Themen 4
A OOP Variable in anderer Klasse durch Methode aufrufen und einer anderen Variable gleichsetzen Java Basics - Anfänger-Themen 2
S Variable Parameter Java Basics - Anfänger-Themen 5
D Datei auslesen & Werte in Variable speichern Java Basics - Anfänger-Themen 12
P if - Statement erkennt variable nicht. Java Basics - Anfänger-Themen 12
J Ungewollte Wertveränderung einer Variable Java Basics - Anfänger-Themen 9
R Variablen Variable an FXML-Controller übergeben Java Basics - Anfänger-Themen 4
J Zugriff auf Variable in anderem Programm Java Basics - Anfänger-Themen 5
R variable istpositiv might not have been initialized Java Basics - Anfänger-Themen 2
A Methodenname aus variable Java Basics - Anfänger-Themen 2
L Variable aus einer Klasse in einer anderen Klasse nutzen Java Basics - Anfänger-Themen 6
P Methode soll Variable einer anderen Klasse ändern. Wie? Java Basics - Anfänger-Themen 1
Hanschyo Variable nicht initialisiert Java Basics - Anfänger-Themen 6
deatzi Variable aus If Abfrage später nutzen Java Basics - Anfänger-Themen 4
L Variable in If-Statement initialisieren Java Basics - Anfänger-Themen 4
C return kann nicht auf variable zugreifen Java Basics - Anfänger-Themen 26
S Wie erstelle ich eine Vorbedingung für eine Variable einer Methode ? Java Basics - Anfänger-Themen 5
S Warum kann ich nicht mehr als eine Variable in einer for Schleife deklarieren ? Java Basics - Anfänger-Themen 1
V Warum speichert meine String-Variable nummerische Werte? Java Basics - Anfänger-Themen 3
J Wert eines Arrays einer Variable zuweisen, sobald der Wert eines anderen Arrays eintritt Java Basics - Anfänger-Themen 2
DaCrazyJavaExpert Compiler-Fehler Variable nicht mit null initialisiert, trotzdem: NullPointerException Java Basics - Anfänger-Themen 28
A Erste Schritte Mein Programm erkennt die variable EinAus.readInt nicht Java Basics - Anfänger-Themen 15
Aprendiendo [JAVA-Syntax] (int... variable) bei einem Konstruktor Java Basics - Anfänger-Themen 8
F Variablen If else: Einer Variable einen Wert hinzufügen oder so? Java Basics - Anfänger-Themen 6
Aprendiendo Interpreter-Fehler "non-static variable this cannot be referenced from a static context" Java Basics - Anfänger-Themen 2
D Aufruf einer statischen Variable Java Basics - Anfänger-Themen 1
F [OOP] Auf eine Variable aus meherer Klassen zugreifen Java Basics - Anfänger-Themen 22
D Einer Variable automatisch Zahlen hinzuaadieren Java Basics - Anfänger-Themen 3
BadBat Klassen instanz als variable + methodenaufruf Java Basics - Anfänger-Themen 4
BadBat Variablen Eine Variable mit 2 Typen Java Basics - Anfänger-Themen 38
S Cannot find symbol (symbol ist eine Variable) Java Basics - Anfänger-Themen 13
K String einlesen und als Variable speichern Java Basics - Anfänger-Themen 8
M Variable noch erstellen oder lieber so? Java Basics - Anfänger-Themen 1
G Variable Objektnamen Java Basics - Anfänger-Themen 43
B Variable in mehreren Klassen nutzen Java Basics - Anfänger-Themen 4
T static String Variable wird nur beim ersten aufruf durch eine Funktion geändert. Java Basics - Anfänger-Themen 16
H Innerhalb einer Methode eine Variable der aufrufenden Methode ändern? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben