Klassen mit new, Klassenattribute initialisieren

David2456

Aktives Mitglied
Hallo,
Ich bräuchte bei folgender Aufgabe hilfe. Sie ähnelt einer meiner letzten Aufgaben nur das hier nur mit "new" eine Klasse angelegt wird. Ich weiß nicht so richtig wie ich hier die Werte den Attributen zuweise da ich ja keine Methode gegeben habe bzw. schreiben soll. Könnte mir einer die Aufgabe erläutern und einen Ansatz machen? Danke schonmal
Java:
public class BoardGame {
   
   
            public static void main(String[] args) {
                new GameFigure(1, "gruen", 4);
                new GameFigure(1, "gruen", 7);
                new GameFigure(2, "gelb", 2);
                new GameFigure(3, "schwarz");
                GameFigure.printAllFigures();
               
                new GameFigure(1, "gruen", 7);
                new GameFigure("grau");
                new GameFigure("grau");
                new GameFigure("grau");
                new GameFigure("schwarz", 10);
                GameFigure.printAllFigures();
               
                GameFigure.deleteFigure(new GameFigure(1, "gruen", 7));
                GameFigure.deleteFigure(new GameFigure(99, "schwarz", 10));
                GameFigure.printAllFigures();
            }
}
Java:
public class GameFigure.java {
   
    private int ID;
    private String Color;
    private int Halo;
   
   
}
 

Anhänge

  • 1.JPG
    1.JPG
    74,1 KB · Aufrufe: 38
  • 2.JPG
    2.JPG
    87,8 KB · Aufrufe: 38
K

kneitzel

Gast
Dann schau Dir doch bitte noch einmal die Grundlagen zu Klassen in Java an! Da gibt es genug Quellen im Internet (z.B. Java ist auch eine Insel) falls Du im Unterricht nicht genug Materialen bekommen haben solltest.

Fängt schon an mit den Klassen: Die Klasse heißt GameFigure und ist in einer Datei GameFigure.java gespeichert. Das .java hat nichts in dem Code der Klasse zu suchen.

Dann brauchst Du Konstruktoren. Die Aufgabe gibt ja Aufrufe vor, so dass Du die notwendigen Konstruktoren ableiten kannst.

Dann brauchst Du ein paar statische Funktionen - kannst Du auch aus den Aufrufen ableiten.

Dann hast DU den Rahmen und kannst Anfangen, dies mit Sinn zu füllen.

Konrad
 

Jardcore

Top Contributor
Das Stichwort ist, wie kneitzel schon angemerkt hat, Konstruktor, wenn das das bei Google eingibst, vielleicht noch mit dem Schlüsselwort Java bekommst du reichhaltige Informationen wie du deine Aufgabe lösen kannst. Falls du danach noch Probleme haben solltest, kannst du dich nochmal Melden.

Beste Grüße,
Jar
 

David2456

Aktives Mitglied
Ok. Bin schon weiter gekommen. Kurze Frage: Werden Klassenattribute oder Objektattribute, sofern keine initialisierung geschrieben wurde, mit 0, null, false etc. initialisiert?

edit Frage 2: static final int bsp = 1; Wofür steht static und final(heißt final nicht das der Wert endgültig gesetzt ist und nicht geändert werden kann?)?
 

Joose

Top Contributor
primitive Datentypen haben einen Default Wert. Dieser ist je nach Typ -> 0 oder 0.0 oder false
Bei komplexen Datentyp ist der Default einfach "null".

Ja bei "final" darf der Wert nur 1x gesetzt werden entweder direkt bei der Deklarierung oder spätestens im Konstruktor.

"static" besagt nur das es sich hierbei um ein Klassenattribut handelt, auf diese Attribut kannst du auch zugreifen wenn du gar kein Objekt einer Klasse hast.
Bei Objektattributen (ohne static) kannst du nur darauf zugreifen sofern du ein Objekt dieser Klasse erstellt hast.

Beispiel:
Java:
public class Account {
    static final int DEFAULT_ACC_ID = -1;
    
    int id;
    String name;

    public Account(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public static void main(String[] args) {
        System.out.println(Account.DEFAULT_ACC_ID);
        Account acc = new Account(122, "David");
        System.out.println(acc.id + " - " + acc.name);
    }
}

Auf das Klassenattribut kannst du jederzeit zugreifen, auf die Objektattribute eben nur wenn du ein Objekt der Klasse erstellt hast
 
Zuletzt bearbeitet:

Jardcore

Top Contributor
Dabei muss man noch ein paar Kleinigkeiten beachten. Und zwar zu einem die Sichtbarkeiten und zum anderen wie lange statische Objektvariablen im Speicher bleiben.
Eine statisches Attribut ist nur dann von außen sichtbar wenn man sie als public deklariert oder aus dem gleichen package heraus ohne einen sichtbarkeits modifier (so wie im Beispiel von Joose). Ist die Variable jedoch als private deklariert kann man von außen nicht auf sie zugreifen.

Welche Gründe gibt es also noch eine Methode privat und statisch zu deklarieren?

Also eine statische Methode wird erstellt wenn dein Programm startet und aus dem Speicher erst entfernt wenn das Programm geschlossen wird. Ein normales Klassenattribut hingegen wird erst in den Speicher gelegt wenn man den new Operator aufgerufen hat und gelöscht wenn es keine Referenz mehr auf das Objekt gibt.

Beste Grüße,
Jar
 

Joose

Top Contributor
Welche Gründe gibt es also noch eine Methode privat und statisch zu deklarieren?

Weil entsprechende Methode vielleicht nur intern gebraucht wird ;)

Also eine statische Methode wird erstellt wenn dein Programm startet und aus dem Speicher erst entfernt wenn das Programm geschlossen wird. .....

Nicht ganz richtig, statische Attribute werden erst initialisiert sobald die Klasse vom Classloader geladen wird (static initializer). Und der Speicher für Methoden und Objekte wird auch erst dann reserviert wenn der Code es verlangt (und nicht direkt beim Programstart).
 

Jardcore

Top Contributor
Weil entsprechende Methode vielleicht nur intern gebraucht wird
Das stimmt, üblicherweise benutzt man sie dann als Konstanten, könnte aber auch das static weglassen.

sobald die Klasse vom Classloader geladen wird
Und das passiert wenn man das Programm startet :p
Ich bin jetzt davon ausgegangen, dass wenn man eine public static variable deklariert diese auch irgendwo benutzt.
Hab mich wohl ungünstig ausgedrückt.
Joose hats natürlich auf den Punkt gebracht.
 

Joose

Top Contributor
Das stimmt, üblicherweise benutzt man sie dann als Konstanten, könnte aber auch das static weglassen.

Eine Methode als Konstante? Hä?

Und das passiert wenn man das Programm startet :p
Ich bin jetzt davon ausgegangen, dass wenn man eine public static variable deklariert diese auch irgendwo benutzt.

Jein, natürlich wird man Klassen die man schreibt auch verwenden.
Aber eine Klasse wird erst geladen wenn sie benötigt wird (also das erste mal wen man eine statisches Attribut, eine statische Methode braucht oder ein Objekt der Klasser erzeugen will) und nicht direkt beim Programstart.
 
K

kneitzel

Gast
Und dann gibt es ja auch die Möglichkeit, einen eigenen ClassLoader zu nutzen. Und dann sollte es auch möglich sein, geladene Klassen dem GC zu überlassen, so dass auch statische Inhalte vor Programmende nicht mehr geführt werden.

Da habe ich mal vor langer Zeit mit herum gespielt. Damals ging es darum, dass ich Java Klassen zur Laufzeit aktualisieren können wollte. Die Idee war halt, dass man ClassLoader mit allen geladenen Klassen und den zugehörigen Instanzen alle komplett nicht weiter referenziert hat so dass diese ganze Sammlung an Instanzen vom GC entsorgt werden konnte.

Aber das müsste ich mir selbst wieder einmal im Detail ansehen - das habe ich so jetzt nicht mehr parat.
 
K

kneitzel

Gast
Interessant. JRebel muss ich mir mal näher ansehen. Alleine schon, wie dort gewisse Probleme gelöst wurden würde mich einmal interessieren. Wenn Du ein komplexes System hast mit Instanzen, dann kannst Du in der laufenden Applikation ja eine Instanz nicht einfach so ersetzen. Ich hatte damals dann doch ein paar Probleme mehr zu lösen aber evtl. hatte ich es auch einfach nur zu kompliziert gemacht...
 

Neue Themen


Oben