Konstruktor



  • Hallo!

    Kanbn mir eventuell mal jemand die Bedeutung eines Konstrukters erklären oder wo zu man den überhaupt brauch? Hier in dem Beispiel ist ja einer eingebaut aber was der bringen soll ich verstehe es einfach nicht. Genauso wie die Zuweisungen... Was solleb die für einen Sinn haben? Kann mir wer helfen? Vielen Dank!!

    class Cmitarbeiter{   // auf die variablen die heir festgelegt sind können alle methoden zugreifen
    String m_name;
    String m_vorname;
    int m_gehalt;
    
    Cmitarbeiter(String nam, String vorname, int gehalt)   // Konstrukter.... initalisiert die Objekte
    {
    m_name= nam;   // ?????????????? die nehme ich doch nirgends anders!? was soll das??
    m_vorname= vorname;
    m_gehalt= gehalt;
    }
    void datenAusgeben()  // methode
    {
    System.out.println("\n");
    System.out.println("Name:"+ m_name);
    System.out.println("Vorname:"+ m_vorname);
    System.out.println("Gehalt: "+ m_gehalt+ "Euro");
    }
     void gehaltErhoehen(int erhoehung) // noch ne methode
     {
     m_gehalt+= erhoehung;
     }
     }
    
     public class Cmitarbeiterbeispiel{    //grundgerüst von java
     public static void main (String[] args){
     Cmitarbeiter billy = new Cmitarbeiter("Gates","Bill",3000);    //übergibt das an den konstruktor aber wozu??? voll komisch???
     Cmitarbeiter stevie = new Cmitarbeiter("Jobs","Stevie",3500);
    
     billy.datenAusgeben(); //nimm billy mit den seienn Daten  und greife dann auf datenausgeben zu und setzte die da ein 
     stevie.datenAusgeben();
    
     billy.gehaltErhoehen(500); // nimm billy und setze die 500 in die methode gehalterhöhen ein 
     stevie.datenAusgeben();
     }
     }
    


  • Der Konstruktor ist die erste "Methode" von einem Objekt, die aufgerufen wird. Der Konstruktor hat die Aufgabe, allen Variablen eines Objektes einen Wert zuzuweisen, so dass das Objekt nach der Erzeugung gleich (sinnvoll) benutzt werden kann.

    In deinem Beispiel weist der Konstruktor "m_name", "m_vorname" und "m_gehalt" die Werte der Argumente "nam", "vorname" und "gehalt" zu. Die Argumente werden von dem Aufrufer übergeben. Würde dies nicht geschehen, dann hätte der Mitarbeiter keinen Namen und kein Gehalt. Sowas würde wenig Sinn machen. 😉



  • Willst du uns verarschen oder bis du blöd? Wie oft sollen wir dir das Programm noch erklären?
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-178111.html



  • Ich habe den Sinn davon, Instanzvariablen im Konstruktor mit Quasinamen zu versehen auch nie verstanden.



  • Du hast ja in deiner Klasse die Instanzvariablen 'nam', 'vorname' und 'gehalt' gegeben.
    Damit du später in deiner Main-Methode diese Variablen initialisieren ("füllen") kannst, brauchst du einen Konstruktor.

    Als erstes musst du dem Konstruktor aber klarmachen, welche Variablen er überhaupt nehmen soll. - Das nennt sich dann "Deklaration".

    Das macht diese Zeile hier:

    Cmitarbeiter(String nam, String vorname, int gehalt)
    

    Damit sagst du dem Konstruktor also, dass er es in Zukunft mit den Variablen "nam", "vormane", "gehalt" zu tun hat.

    Desweiteren musst du nun dem Konstruktor auftragen, deine Variablen zu "füllen" (deklarieren).

    Das geschieht hier:

    m_name= nam;   
    m_vorname= vorname;
    m_gehalt= gehalt;
    

    m_name = nam; bedeutet einfach, dass der Konstruktor nun das, was du später unter dem Parameter "nam" eingibst, unter dem Quasinamen "m_name" speichert.

    "m" steht wohl für "männlich". Denn du könntest zB. auch einen weiteren Parameter für das Geschlecht der Person hinzugefügt haben, um deine Mitarbeiter leicher zu verwalten.
    Das sehe dann zB. so aus.

    [java]

    Cmitarbeiter(String nam, String vorname, int gehalt, char geschlecht){

    if(geschlecht == m){
    m_name= nam;
    m_vorname= vorname;
    m_gehalt= gehalt;

    else{
    w_name= nam; // w für weiblich
    w_vorname= vorname;
    w_gehalt= gehalt;
    }
    }

    [/java]

    In diesem Beispiel wohl sinnfrein, aber nur so zur Veranschaulichung.

    Wenn du nun in deiner Main-Methode ein Objekt erstellst:

    Cmitarbeiter billy = new Cmitarbeiter("Gates","Bill",3000);
    

    dann geschieht folgendes:

    Mit "Cmitarbeiter" weiß dein Programm, dass er auf die Klasse "Cmitarbeiter" "zugreiffen" soll (und erstellt gleichzeitig eine Variable der Klasse Cmitarbeiter).
    "Billy" steht als Name für das neue Objekt. Denn in Java gibt es eigentlich keine direkten Zugriffe auf die Klasse selbst. Du kannst es dir so vorstellen:

    Mit

    Cmitarbeiter billy...
    

    hast du eine Kopie deiner Klasse erstellst. Und diese Kopie heißt nun "Billy".

    Mit

    = new Cmitarbeiter("Gates","Bill",3000);
    

    hast du deine Instanzvariablen des Objektes "Billy" gefüllt.

    Genauer:

    "new Cmitarbeiter" ruft den Konstruktor der Klasse Cmitarbeiter auf.
    Das, was in den Klammern steht "("Gates","Bill",3000)" weist den Konstruktor an, die in ihm deklarierten Variablen zu initialisieren.

    Alles klar? - Nein? Dann sag entweder deinen Lehrer, dass er ein Idiot ist, oder pass besser im Unterricht auf und mach deine Hausaufgaben. Oder kauf dieses Buch : http://www.amazon.de/Grundkurs-Programmieren-Einstieg-Programmierung-Objektorientierung/dp/3446404937/ref=pd_bxgy_b_img_b/302-1262626-8243225?ie=UTF8&qid=1176343519&sr=8-1



  • Zusatzfrage:

    Ich habe mal gesehen dass man mit static{} Vars initialisieren kann.

    public class Class
    {
    public static int etwas;

    static
    { etwas = 0; }

    }

    Irgendwie so(bin nicht mehr ganz sicher)

    Ich weiss, dass dies also vor dem Konstruktor passiert(da static)... also wenn static{} die Lösung zu einem Problem ist, kann mir dann jemand das Problem erklären?

    Danke!



  • das problem ist statische felder zu initialisieren



  • Da muss ich kurz genauer Nachfragen...

    Ja, aber wieso oder besser unter welchem konktreten Fall ist ein Beispiel bekannt?

    Machts n Unterschied ob ich...

    public static int etwas = 0;

    ...oder...

    public static int etwas;
    static{ etwas = 0; }

    ...schreibe? Das Ergebnis ist doch das selbe?

    Danke



  • schonmal versucht ner statischen Map einen eintrag hinzuzufügen auf die art und weise?



  • Ach so, alles klar danke,
    bin auf meinem Beispiel festgefahren gewesen.

    thnx


Anmelden zum Antworten