# Klassen mit new, Klassenattribute initialisieren



## David2456 (18. Jan 2016)

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

```
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();
            }
}
```


```
public class GameFigure.java {
   
    private int ID;
    private String Color;
    private int Halo;
   
   
}
```


----------



## kneitzel (18. Jan 2016)

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 (18. Jan 2016)

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 (18. Jan 2016)

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 (18. Jan 2016)

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:

```
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


----------



## Jardcore (19. Jan 2016)

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 (19. Jan 2016)

Jardcore hat gesagt.:


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



Weil entsprechende Methode vielleicht nur intern gebraucht wird 



Jardcore hat gesagt.:


> 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 (19. Jan 2016)

Joose hat gesagt.:


> Weil entsprechende Methode vielleicht nur intern gebraucht wird


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



Joose hat gesagt.:


> sobald die Klasse vom Classloader geladen wird


Und das passiert wenn man das Programm startet 
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 (19. Jan 2016)

Jardcore hat gesagt.:


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



Eine Methode als Konstante? Hä?



Jardcore hat gesagt.:


> Und das passiert wenn man das Programm startet
> 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.


----------



## kneitzel (19. Jan 2016)

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.


----------



## Jardcore (19. Jan 2016)

kneitzel hat gesagt.:


> Damals ging es darum, dass ich Java Klassen zur Laufzeit aktualisieren können wollte.


JRebel <3


----------



## kneitzel (19. Jan 2016)

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...


----------

