Initialisierung von Variablen

Status
Nicht offen für weitere Antworten.

flaffy

Mitglied
Hallo ;)

Die Frage hört sich ein bischen doof an ... aber in wieweit beeinträchtigt die Initialisierung von Variablen die Performance? Ich komme eher aus der Microsoft Schiene und da wurde mir eingebläut das es zum guten Programmierton gehört sich nicht auf "Standardwerte" zu verlassen. Seitdem baue ich z.B. meine Beans wie folgt...

private String asdf1 = null;
private int asdf2 = 0;

Auf die Frage komme ich deswegen, zum einen da mir mein Compiler mal eine Warnung in Form von "Variable might have not been initialized yet" ausgegeben hat; und zum anderen weil ich mal mit einer Varialbe rechnen wollte, ein += ausgeführt habe und immer 0 zurück bekommen habe. Beim debuggen habe ich dann festgestellt das diese Variable eine Art NaN bzw. laut Dokumentation dies eine Art von "nicht initialisiert" darstellt.
 
B

Beni

Gast
Instanzvariablen haben immer ein Default-Wert.
Lokale Variablen werden (wegen der Performance) der default nicht initialisiert.
Es kommt also draufan, welche Variablen du betrachtest.

Code:
public class Blupp{
  private int test; // ist so ok
  private int test2 = 0; // ist mit der oberen Linie identisch

  public int doSomething(){
    int test; // kann ein Problem geben.
  }
}

"Variable might have not been initialized yet"
Hm, das sollte keine Warnung sein. Zumindest mein Compiler sieht das als Fehler an (was es meist auch ist).
 

Bleiglanz

Gesperrter Benutzer
gar nicht

member variablen werden sowieso initialisiert (ist also eine reine Stilfrage)

und blockvariablen MÜSSEN initialisiert werden (hast du ja schon gemerkt)
 

Mag1c

Top Contributor
Hi,

ja, doch, das tut sie doch. (Bzw. ich weiß nicht, ob und welche Compiler das wegoptimieren.)
Normalerweise werden solche Initialisierungen tatsächlich durch Befehle ausgeführt.
Aber wie hier schon erwähnt wurde, sind Instanzvariablen mit Default-Werten belegt,
sodaß man sich solche Initialisierungen sparen kann (und damit auch ein winziges bisschen Performance gewinnt ;) )

Gruß
Mag1c
 
B

Beni

Gast
Glaubst du der Defaultwert kommt aus dem Nichts?
Glaubst du ernsthaft, da wäre ein Performancegewinn der über 1 Nanosekunde hinausgeht?

Optimier erst wenn du siehst, dass es zu langsam ist. Und vorallem: optimier dort, wo es sich lohnt :wink:
 

Mag1c

Top Contributor
Hi,

mir gings hier nur ums Prinzip. Und da wir ja hier korrekte Informationen weitergeben
wollen, habe ich das mal richtig gestellt. Ob da ein Performancegewinn tatsächlich messbar
ist, ist mir ehrlich gesagt wurscht 8)

Gruß
Mag1c
 
G

Guest

Gast
Ist jemand schon auf dieses Problem gestossen?
Code:
public class Test {

  public static void main(String[] args) {

    abstract class A {

      public A() {
        init();
      }

      protected abstract void init();
    }
    
    class B extends A {

      private int i=10;
      
      public B() {
        super();
      }
      
      protected void init() {
        System.out.println(i); // Was wird hier ausgegeben? ;)
      }
    }
    
    new B();
  }
}
Hat mich mal paar graue Haare gekostet, bis ich den Debugger
angeschmissen habe. Ich habe eine abstrakte Klasse aus einem Framework
überschrieben, die eine Initialisierung in der oben angegebenen Form
anstösst. Lokale Variablen bzw. Instanzvariablen werden aber erst nach dem
Konstruktor initialisiert. Schön doof, was?
Solchen Fehler macht man nur einmal. ;)
 

Mag1c

Top Contributor
Hi,

jaaa ... Moment mal ... nicht so schnell ... :)

das ganze ist nämlich noch Compiler-abhängig. Bei dem einen Compiler werden die
Instanz-Variablen nach dem Konstruktor initialisiert. Bei einem anderen Compiler
geschieht das vor dem Konstruktor (also zwischen Objekterzeugung und Ausführung
des Konstruktor-Codes). So liefert dann der folgende Code Compiler-abhängig
unterschiedliche Ergebnisse:

Code:
public class Test {
    private int zahl = 0;

    public Test () {
        zahl = 1;
    }
}

(Allerdings sind meine Erfahrungen diesbezüglich schon ein paar Tage alt. Könnte
sein, daß sich die Compiler-Bauer inzwischen auf eine Variante geeinigt haben)

Gruß
Mag1c
 
G

Guest

Gast
Das hat nichts mit dem Compiler zu tun, es ist "normales" Laufzeitverhalten der JVM.
Zuerst wird die Super-Instanz initialisiert, erst dann kommt es zurück zur überschreibenden
Instanz, wo die Instanzvariablen initialisiert werden und der Code des Konstruktors
ausgeführt wird.
In Deinem Beispiel ist keine Vererbungshierarchie im Spiel.

Wie auch immer, es ist gut sowas zu wissen, sonst wundert man sich, wenn einem
die Anwendung um die Ohren fliegt. :wink:
 

Mag1c

Top Contributor
Hi,

ja war klar, daß es da Proteste gibt :) Hab aber nur meine Erfahrungen wiedergegeben.
Wir haben mal vor einiger Zeit nach einem Fehler gesucht, der nur bei Verwendung
des einen Compilers auftrat. Beim anderen Compiler gings es. Grund war eben
das von mir oben beschriebene Verhalten.

Ja, es kann durchaus sein, daß das ein Fehler im Compiler war, keine Ahnung. Vielleicht
war auch damals der Ablauf noch nicht ganz so festgelegt (ist inzwischen 4 Jahre her).

Gruß
Mag1c
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
S Die Initialisierung von Feldern in ableitender Klasse erzwingen..? Allgemeine Java-Themen 16
C Konvention zur Initialisierung von Attributen Allgemeine Java-Themen 4
S einmalige Initialisierung Allgemeine Java-Themen 7
A Observer und Initialisierung Allgemeine Java-Themen 7
hdi Frage zur Objekt Initialisierung Allgemeine Java-Themen 4
M Initialisierung von Objektvariablen - vor/nach dem this()? Allgemeine Java-Themen 4
V Initialisierung nur im Konstruktor? Allgemeine Java-Themen 14
M Initialisierung Enumuration Allgemeine Java-Themen 15
G Object erstellung und initialisierung. Allgemeine Java-Themen 4
M Initialisierung von Attributen Allgemeine Java-Themen 7
C Erste Schritte Variablen in abhängigkeit von Git branch Allgemeine Java-Themen 7
Fabiator Variablen Variablen Zählen Allgemeine Java-Themen 3
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
berserkerdq2 Labels in IJVM sind keine lokalen Variablen oder? Allgemeine Java-Themen 2
O Fehler bei Variablen Allgemeine Java-Themen 2
N File Path mit Variablen angeben Allgemeine Java-Themen 1
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
R Geometry erstellen die abhängig von Variablen ist Allgemeine Java-Themen 6
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
P static Blocks und variablen Allgemeine Java-Themen 41
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
V Datentypen Graphikrechner 2/Strings und Variablen in Doubles umwandeln Allgemeine Java-Themen 6
S Kann man Variablen oder Felder definieren deren Typ zwei Interfaces ist..? Allgemeine Java-Themen 9
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
D BlueJ, Variablen die mehrfach vorkommen gleichzeitig umbenennen Allgemeine Java-Themen 3
C Variablen Variablen mit unendlichem Wert Allgemeine Java-Themen 22
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
T Maximale Felder maximale Variablen Allgemeine Java-Themen 2
W Lebendige Variablen herauslesen Allgemeine Java-Themen 1
K Summierung einer Variablen Allgemeine Java-Themen 5
B Gibt es eine Funktion die den Datentyp einer Variablen ermittelt? Allgemeine Java-Themen 8
X Threads Externe Variablen in Run Methoden verändern Allgemeine Java-Themen 4
Messoras Klassen Sämtliche Variablen einer Klasse übernehmen Allgemeine Java-Themen 6
K Static Variablen verbieten Allgemeine Java-Themen 10
I Problem beim Aufrufen, von Objektmethoden/ -variablen Allgemeine Java-Themen 6
J Text lesen und in Variablen speichern Allgemeine Java-Themen 3
A Best Practice Variablen vertauschen - Performance Allgemeine Java-Themen 1
F Variablen Variablen schachteln Allgemeine Java-Themen 6
7 6 int variablen vergleichen Allgemeine Java-Themen 34
C Threads Variablen in einem Thread Aktualisieren Allgemeine Java-Themen 17
M Variablen Variablen in Text einbinden Allgemeine Java-Themen 5
K Überschreiben von Variablen bei rekursivem Funktionsaufruf Allgemeine Java-Themen 2
R Übergreifende Variablen? Allgemeine Java-Themen 10
OnDemand Input/Output Variablen in Datei Speichern um sie wieder auszulesen Allgemeine Java-Themen 4
D Variablen zur Laufzeit global speichern (Registry Pattern?) Allgemeine Java-Themen 6
iB0T "goto" Befehl aus Batch in Java und Variablen wert immer wieder neu setzen Allgemeine Java-Themen 4
D ClassLoader für Variablen einer Klasse setzen Allgemeine Java-Themen 24
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
D Alle Variablen final setzen ? Allgemeine Java-Themen 26
C Kapselung Warum graift man auf Variablen nur über Methoden und nich direkt zu? Allgemeine Java-Themen 10
C Classloading und statische Variablen Allgemeine Java-Themen 2
K Variablen speichern Allgemeine Java-Themen 2
S Variablen bei Aufruf zurücksetzen Allgemeine Java-Themen 4
faetzminator statische Variablen in Interface - Vererbung? Allgemeine Java-Themen 9
V Gibt es einen Variablen Cast? Allgemeine Java-Themen 8
K Mehrere JVMs die auf eine Klasse mit statischen Variablen zugreift Allgemeine Java-Themen 19
D Wann sollte ich statische Methoden und Variablen benutzen? Allgemeine Java-Themen 44
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
J Statische Variablen, Threadübergreifend. Allgemeine Java-Themen 4
E Variablen anderer Klassen auslesen (nur Name bekannt) Allgemeine Java-Themen 4
P Variablen in einer anderen Klasse auf Änderungen überwachen Allgemeine Java-Themen 12
V Typargument einer Variablen erfragen Allgemeine Java-Themen 4
B Rechnen mit mehreren Variablen Allgemeine Java-Themen 2
G Thread variablen Sichtbarkeit Allgemeine Java-Themen 15
J Java Pfad nicht mehr in Path Variablen??? Allgemeine Java-Themen 2
T Mit JNI finale Variablen überschreiben Allgemeine Java-Themen 14
T JNI -> auf Java-Variablen etc zugreifen Allgemeine Java-Themen 6
M Bezeichnung für Component-Variablen Allgemeine Java-Themen 6
M Variablen an Java-Programm übergeben Allgemeine Java-Themen 3
Airwolf89 dynamischer Zugriff auf Variablen/ Objekte Allgemeine Java-Themen 4
A Überschreibung von Variablen Allgemeine Java-Themen 3
A JavaCC: Variablen zaehlen Allgemeine Java-Themen 12
B globale und lokale Variablen Allgemeine Java-Themen 17
G referenz von variablen Allgemeine Java-Themen 9
O getRuntime().Exec() - Environment - Variablen setzen? Allgemeine Java-Themen 2
S XML-Parsing / public-Member-Variablen / Design-Frage Allgemeine Java-Themen 8
M Variablen Speicher wieder freigeben ? Allgemeine Java-Themen 9
N Variablen eines Objektes (instanz) in einen Array lesen Allgemeine Java-Themen 7
S In Subklasse auf private Variablen zugreifen Allgemeine Java-Themen 4
S Variablen und ihre Tücken. Allgemeine Java-Themen 7
C Binärbereich einer Variablen abfragen Allgemeine Java-Themen 8
J Zugriff auf den Namen einer Variablen Allgemeine Java-Themen 7
J Überschreiben von Variablen Allgemeine Java-Themen 3
C dynamische variablen Namen! Allgemeine Java-Themen 4
M Int und String Variablen verändern Allgemeine Java-Themen 10
H zwei Date Variablen überschreiben sich Allgemeine Java-Themen 2
G Taushen der Input variablen einer method Allgemeine Java-Themen 14
P Objekt- Variablen Allgemeine Java-Themen 16
K Environment Variablen per java -D weitergeben Allgemeine Java-Themen 9
D in class-Dateien nach variablen suchen! Allgemeine Java-Themen 5
F Werte von Member-Variablen erst im Konstruktor setzen? Allgemeine Java-Themen 7
T Größe eine Variablen in Bytes? Allgemeine Java-Themen 22
B Reguläre ausdrücke mit variablen? Allgemeine Java-Themen 12
MQue JButton an verschiedenen Variablen Allgemeine Java-Themen 2
T Unabhängigkeit von Variablen/ Objekten. Allgemeine Java-Themen 6
G Frage zu statischen Variablen bei Vererbung Allgemeine Java-Themen 15
L Sichtbarkeit von Variablen / getMethode Allgemeine Java-Themen 4
H Variablen (A1, A2, A3 mit A_irgendetwas aufrufen) ohne Array Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben