Java Referenzvariable deklarieren

_tnt_

Lt. Junior Grade
Registriert
Aug. 2006
Beiträge
439
Hallo,
ich habe eine Frage bezüglich der Deklarierung einer Referenzvariable (ich hoffe dies ist richtig formuliert).

Klasse 1:
Java:
class Test {

    public static void main (String [] args) {

        int x = 0;
        Testdrei [] dr = new Testdrei[4]; // definiert ein neues array vom typ "dreieck" mit der größe "4 und namen "dr"


        while (x < 4) {
            dr[x] = new Testdrei(); // deklariert eine Dreieck.Referenzvariable
            dr[x].hoehe = (x + 1) * 2;
            dr[x].breite = x + 4;
            dr[x].flaeche = dr[x].hoehe * dr[x].breite;

            System.out.println("Hoehe: " + dr[x].hoehe);
            System.out.println("Breite: " + dr[x].breite);
            System.out.println("Flaeche: " + dr[x].flaeche);
            System.out.println("\n");

            x++;
        }

    }
}

Klasse 2:
Java:
public class Testdrei {
        double flaeche;
        int hoehe;
        int breite;
    }

Weshalb benötige ich die Zeile 10: dr[x] = new Testdrei();

Ich erstelle in der Zeile 6 schon ein Array vom Typ "Testdrei". Warum kann ich nicht einfach die Werte in der while-Schleife ohne Zeile 10 zuweisen? Das klingt jetzt vielleicht komisch, aber ich verstehe die Notwendigkeit nicht.

Gruß
 
Ganz einfach: das Array wird leer erstellt, enthält also an jeder Stelle nur NULL. Der Typ des Arrays gibt nur an welche Objekte darin erstellt werden können, es werden aber nicht automatisch welche erzeugt.
 
Stichwort Pointer:
AFAIK Hast du in Java kein Array vom Typ Testdrei, sondern ein Array vom Typ Pointer auf Objekt vom Typ Testdrei

Und die Pointer zeigen am Anfang auf keine Objekte, diese musst du erst Anlegen und den Pointer darauf zeigen lassen.
 
Im Prinzip reserviert der Compiler bei der Deklaration nur einen Speicherbereich für das Array. Ein Objekt vom Typ "Testdrei" benötigt vereinfacht dargestellt 1x 8 Byte (double) + 2x 4 Byte (int), also insgesamt 16 Byte.

Mal ganz banal ausgedrückt reserviert der Compiler mit der Zeile
Code:
Testdrei [] dr = new Testdrei[4];
also 4x 16 Byte im Speicher, mehr nicht. Der Inhalt wird also nicht angefasst bzw. wird genullt.
 
Raijin schrieb:
Mal ganz banal ausgedrückt reserviert der Compiler mit der Zeile
Code:
Testdrei [] dr = new Testdrei[4];
also 4x 16 Byte im Speicher, mehr nicht. Der Inhalt wird also nicht angefasst bzw. wird genullt.
Wenn dem so wäre müsste er aber kein Objekt mehr erstellen und könnte direkt auf den Speicher zugreifen. AFAIK macht Java das nämlich genau nicht so, sondern Reserviert nur den Speicher für 4 Pointer.
Ansonsten könnten man schließlich auch kein Array von einem Interface Typ erstellen.
 
Deswegen schrieb ich ja "banal ausgedrückt" und "vereinfacht dargestellt". Ein Mensch würde das so machen und deswegen ist es leichter zu verstehen. Die Speicherverwaltung des Compilers ist selbstredend deutlich komplexer als dargestellt. Wenn aber solch eine Frage gestellt wird, fehlt vermutlich auch ein Stück weit das Verständnis für Pointer ;)
 
Gut möglich, trotzdem halte ich es für Zielführender, auf das Stichwort Pointer zu verweisen, damit man sich einlesen kann.
Pointer sind jetzt nicht gerade eine Kleinigkeit über die man nichts zu wissen braucht. Sobald man die Basics drin hat (Variablen, Schleifen, Klassen/Methoden) sollte man sich mMn sowieso damit befassen.

Ist auch der Grund warum ich finde, dass C eine super Einsteigersprache ist.
Wenn man das ganze Pointer/Speicher geraffel erstmal verstanden hat, versteht man auch deutlich leichter, was in Sprachen wie Java, die das ganze weg-abstrahieren, eigentlich genau passiert wenn man bestimmte Dinge tut.
 
Da hast du wohl recht. Es ist zwar gut, wenn man Dinge vereinfacht darstellt, aber zu einfach ist auch nicht gut ;)
 
Vermutlich hat dich keiner der Beiträge weitergebracht, aber
Jesterfox sagt es schon richtig.

Ich versuche es mal "Bildlicher" mit einem Büroschrank als Erklärung.

Stelle dir vor das in Zeile 6 ein Büroschrank mit 4 Schubladen gebaut wird ( new Testdrei[4] ).
Die Schubladen sind so gebaut, das nur Dreiecke reinpassen.
Aber jetzt sind die Schubladen noch leer und es sind keine Dreiecke drin.

Wir möchten jetzt in jede Schublade ein neues Dreieck reinlegen.
Das macht der Code so:

while (x < 4) { --> Öffne die erste Schublade
dr[x] = new Testdrei(); --> Baue ein neues Dreieck, und lege es in Schublade dr[x] ab, das new Testdrei() brauchst du hier, weil in dein Büroschrank nur Dreiecke reinlegen darfst, das hast du in Zeile 6 so festgelegt.
In Zeile 6 sagt du das es ein Schrank geben soll mit 4 Schubladen in die nur Dreiecke reingelegt werden dürfen.

Die Dreiecke hast du aber jetzt noch nicht, nur den Schrank, deswegen Zeile 10, wo du für jede Schublade ein neues Dreieck baust.

dr[x].hoehe = (x + 1) * 2; --> hier sagt du welche höhe das Dreieck in der x Schublade haben soll
dr[x].breite = x + 4; --> hier sagt du welche breite das Dreieck in der x Schublade haben soll

usw.

hoffe das bringt dich weiter
 
Zuletzt bearbeitet:
Zurück
Oben