Eine kleine Java Frage

Christian Fein

Erfahrenes Mitglied
Nun wenn ich habe:

Code:
class FirstClass
   SecondClass sc = new SecondClass();
end

wann wird dann sc instanziert?
Ebenso wenn die Klasse instanziert wird, vorher match ja kein sinn. sc ist nach diesem Beispiel nicht eine Klassenvariable, und somit macht auch nur eine instanzierung des Members sinn wenn eine inszierung der Klasse erfolgt.

Demnach duerfe sich in Sachen Instanzierungszeitraum und auch lebensdauer rein gar nichts von:
Code:
class FirstClass
   SecondClass sc;
   
   public FirstClass()  {
     sc = new SecondClass();
   }
}
unterscheiden. Sprich der GC räumt beides auf sobald die letzte Referenz auf das Object von FirstClass seine Gültigkeit verliert.

Oder habe ich hier einen Denkfehler? ;)
 

Dario Linsky

Erfahrenes Mitglied
Denkfehler nicht, aber vielleicht hast Du mich nicht ganz verstanden. Es gibt doch immer wieder Situationen, wo man die Objektinstanz noch nicht sofort benötigt. Warum soll man dann also Speicher dafür verschwenden?

Folgendes Beispiel:
Code:
class meineKlasse
{
    public Frame f;

    public meineKlasse()
    {
        // here be nothing!
    }

    public void f_erzeugen()
    {
        f = new Frame("blub");
    }

    public static void main(String[] args)
    {
        meineKlasse mObject = new meineKlasse();
        // hier ist für den Frame noch kein Speicher reserviert, 
        // weil er u. U. gar nicht gebraucht wird
        meineKlasse.f_erzeugen();
        // ab hier kann ich irgendwas mit dem Frame machen
    }
}
 

Thomas Darimont

Erfahrenes Mitglied
Servus!

Sprich der GC räumt beides auf sobald die letzte Referenz auf das Object von FirstClass seine Gültigkeit verliert.

...ceteris paribus ;-)

... man sagt ja, dass bei der Instanziierung eines Objektes zuerst der Konstruktor durchgeführt wird, aber...

Versuch mal folgendes:
(nur zum Spass);

Code:
public class Test(){
   
     static{ 
          System.out.println("eins");
     }

     public Test(){
          System.out.println("zwei");
     }

     public void doOut(){
          System.out.println("drei");
     }
 
     public static void main(String[] args){
        new test().doOut();
     }

}

(Hoffe mal, dass ich mich jetzt nicht verschrieben habe, leider habe ich auf meinem Laptop noch kein JDK installiert ums noch mal vor dem Posten zu testen...)

Gruss Tom
 

Christian Fein

Erfahrenes Mitglied
Habs jetzt nicht ausgetestet, aber es ist logisch das statische Dinge vorher "abgearbeitet" werden.
Das macht auch sinn.

aber hier:

class Foo {
Bar bar = new Bar();
}

ist nicht von static die Rede.
 

Dario Linsky

Erfahrenes Mitglied
Das hängt aber nicht mit der Instanzierung der Klasse zusammen, der Code in dem static-Block wird auch ausgeführt, wenn man keine Instanz von der Klasse anlegt:
Code:
class test
{   
     static
     { 
          System.out.println("eins");
     }

     public test()
     {
          System.out.println("zwei");
     }

     public void doOut()
     {
          System.out.println("drei");
     }
 
     public static void main(String[] args)
     {
        // einfach mal leer lassen
     }
}
 

Christian Fein

Erfahrenes Mitglied
jo :)

das ist bei Ruby interressant:

Code:
$debug = true

class Foo
  if $debug 
      def DebugClass
         puts "Bla"
      end
  end 
end

Klassen Definitionscode wird ausgefuehrt. Sprich mann kann vollkommen Dynamisch Klassen generieren und instanzieren.

Damit kann mann eine Menge Schundluder betreiben, und so machen Programmierer der mit dem Code dann arbeiten muss in den Wahnsinn treiben :)
 

Christian Fein

Erfahrenes Mitglied
Original geschrieben von Lirion
Das hängt aber nicht mit der Instanzierung der Klasse zusammen, der Code in dem static-Block wird auch ausgeführt, wenn man keine Instanz von der Klasse anlegt:

Bestes Beispiel hierfür:

Code:
class Myclass {

 public static void main(String[] args) {
   System.out.println("MyClass wird nie instanziert");
 }

}

Ausgabe, obwohl von Myclass nie etwas instanziert wird.
 

Dario Linsky

Erfahrenes Mitglied
Das ist mir schon klar, Chris. Allerdings stört es mich an Java doch etwas, dass der Einsprungpunkt für das gesamte Programm in einer Klasse definiert wird. Nichts gegen OOP, aber das finde ich persönlich etwas unpraktisch... :rolleyes:

Wenn wir schon voll im Offtopic sind: War nicht irgendwann mal die Rede von einem Forum speziell für programmiertechnisches Offtopic? ;)