Nicht initialisierte Variablen

Hey Leute.

Irgendwie ist das eine Sache, die ich mich bisjetzt nie gefragt habe, die mich gerade aber verwirrt:

wenn ich folgendes schreibe: int a;
sprich eine variable deklariere, sei der typ ein objekt oder ne primitive - was ist diese variable dann?
Instanzvariablen nehmen ja den Standard wert an, sprich zahlenwert 0, false, oder eben null. Aber warum
nur instanzvariablen? Also warum ist, wenn ich folgendes mache: String a; a nicht einfach null,
sondern irgendwie… nichts?

Edit: lerne gerade auch c++… da wird doch trotzdem schon ein pointer erzeugt?
also int a; int* pa = &a; std::cout << pa; gibt mir schon ne speicheradresse… aber da kann doch nicht “nichts” drinstehen?

*** Edit ***

das vielleicht auch lieber ins grundlagen forum schieben…

Eine deklarierte Variable ist nur ein reservierter Speicherplatz, bevor sie einen Wert bekommt.
Ein Pointer ist schlicht ein Zeiger auf einen Speicherplatz.

ja das ist mir klar. aber wenn ich speicher reserviert hab, steht da ja irgendetwas drin, was zu dieser variable gehört.
wieso nimmt eine nicht initialisierte variable diesen wert nicht einfach an?

Da steht überhaupt nichts drin - ist halt nur reserviert. Der Wert ist NAN.

NaN ist etwas gefährlich zu nennen, da das ein Wert von ‘nicht initialisiert’ zu unterscheiden ist,
bei Ganzzahltypen kann man davon eh kaum sprechen, aber bei double:
double d = Double.NaN;

wofür das ‘nicht initialisiert’ offiziell gedacht ist kann ich nicht sagen, auf die Schnelle keinen guten Link gefunden,
offensichtlich ist aber:

  • man kann auch gleich am Anfang einen Wert zuweisen, nur bisschen mehr zu tippen

  • bei Instanzattributen hat man unklare Lebensdauer, verschiedene Methoden die drauf zugreifen,

eine Methode ist dagegen linear vom Compiler überprüfbarer Ablauf, wann kommt welcher Code dran, Variable bis dahin initialisiert?
wenn man if/ else/ Schleifen schreibt dann ganz nützlich zur Kontrolle ob in allen Fällen gesetzt

könnte bei Instanzattribut mit Befüllung bis Ende Konstruktor freilich auch klappen, genauso wie es bei final-Attributen geprüft wird

  • das ‘nichts’ ist auch nur eine Frage der Kombilierbarkeit des Quellcodes, kein bestimmter Wert im Speicher

In Delphi enthalten nicht initialisierte Variablen zufällige Werte, nämlich genau die Werte, die an der reservierten Stelle im Arbeitsspeicher stehen. Das ist bei anderen Programmiersprachen wie C / C++ IIRC genauso.

Bei C++ solltest du genau wissen, was dein Pointer macht.
Ein Pointer auf einen nicht initialisierten Speicherplatz ist gefährlich (blinde Zeiger). Dort wird überschrieben, was gerade da ist.
@cmrudolph :

Jup. Bei C/C++ gibts auch ‚richtige primitive Datentypen‘. Alle konsequenten oo Sprachen nutzen hier autoboxing - was am ende auch nur eine Referenz ist (nur in der Speicherverwaltung günstiger). Kann mich aber auch irren - lange nicht damit beschäftigt… :slight_smile:

und das ist eines der Dinge, die zivilisierte Sprachen wie Java vom Rest trennt :wink:

Zugriff auf zufälligen oder gezielt fremden Speicherplatz mit vorherigen Inhalt,
Buffer overflow - Wikipedia, the free encyclopedia usw., undenkbar in Java und so einfach korrekt zu halten, einfach nur intern ein seriöses Speichermodell, fertig

Das sollte man immer, wenn man direkt mit Pointern arbeiten kann, wissen… Das ist bei C oder Delphi nicht anders.

das Verhalten ist unabhängig davon ob es ein Pointer ist oder nicht. int a oder bool irgendwas führen bei fehlender Initialisierung ebenfalls zu komischem Verhalten (inkl. Absturz)

Jo

okay, habs verstanden, danke euch ^^

[QUOTE=mymaksimus]ja das ist mir klar. aber wenn ich speicher reserviert hab, steht da ja irgendetwas drin, was zu dieser variable gehört.
wieso nimmt eine nicht initialisierte variable diesen wert nicht einfach an?[/QUOTE]
Weil Java so erdacht wurde dass halt genau DAS nicht passieren kann/soll/darf/what ever … und dass dies schon zur Compiletime geprüft wird.
Wenn also der Compiler feststellt dass zur Runtime in einer Referenz “nichts” (im Sinne von : kein gültiger Speicherbereich) stehen wird dann meldet er dies mit dem Error das eine Referenz nicht initialisiert wurde. Und die Intialisierung stellt halt sicher das im reservierten Speicher kein “Müll” steht.
Und bei komplexen Objekten wird dies halt rekursiv geprüft.

Java könnte auch einfach selber 0, false oder null reinschreiben, wie es ja bei Instanzattributen passiert,

nichts muss sichergestellt werden, nichts muss geprüft werden, in anderen Sprachen vielleicht, in Java trivial,
es ist eine reine abstrakte Entscheidung zur Führung der Programmierer, ob lokale Variablen mit Defaultwert initialisiert werden oder nicht

äh, das gibt es doch nur bei lokalen Variablen, Instanzattribute sind eben im Gegensatz dazu sofort initialisiert
→ gerade nix mit Rekursion/ komplexen Objekten (was ich mir nicht anders als als Objekte mit Attributen vorstellen kann) :wink:

Hallo, ich muss etwas Licht ins Dunkle bringen,

  1. klar gibt es in Java primitive Datentypen,
  2. es kommt auf die Umgebung der Variablen an, wird sie (direkt) von einer Klasse umgeben, wird automatisch initialisiert bei Deklaration resp Definition,
  3. zur Compiletime wird garantiert, das Variablen nicht uninitialisierte resp zufällige (resp Müll) oder beim Zugriff schädliche “Werte” habn,
  4. in C/C ++ ist das nicht so.
    Freundliche grüße.

Hallo, ich muss etwas Licht ins Dunkle bringen,

[QUOTE=CyborgBeta]Hallo, ich muss etwas Licht ins Dunkle bringen,

  1. klar gibt es in Java primitive Datentypen,[/QUOTE]hat ja auch niemand was anderes behauptet[QUOTE=CyborgBeta;114936]
  2. es kommt auf die Umgebung der Variablen an, wird sie (direkt) von einer Klasse umgeben, wird automatisch initialisiert bei Deklaration resp Definition,[/QUOTE]ja genau darum geht es, warum wird in der einen Umgebung ein Default Wert genommen und in einem anderen nicht,…[QUOTE=CyborgBeta;114936]
  3. zur Compiletime wird garantiert, das Variablen nicht uninitialisierte resp zufällige (resp Müll) oder beim Zugriff schädliche “Werte” habn,[/QUOTE]Ja das wurde schon genannt, also keine neue Information[QUOTE=CyborgBeta;114936]
  4. in C/C ++ ist das nicht so.[/QUOTE]Auch das ist keine neue Information und auch logisch, da ich da mit meinen Pointern auf Adressen Zeigen kann, wie ich will[QUOTE=CyborgBeta;114936]
    Freundliche grüße.[/QUOTE]
    Have a nice day

Hm, dann war mein Beitrag ja richtig. Ich hab halt festgestellt, dass es noch einige Unstimmigkeiten bzw. Streitigkeiten bzgl. der korrekten Begrifflichkeiten gab. Definition Gültigkeit Sichtbarkeit Scope Bereich wurde noch gar nicht genannt.
Freundliche grüße zurück.