Cannot use this in a static context

  • Hallo..

    Nun hab ich mein Programm umgeschrieben, und ärger mich über ein 2. prinzipielles Unverständnis über Objektorientierte Programmierung:

    button.addActionListener(new ActionListener(this));

    Eclipse meckert hier, dass er "this" nicht in einem statischen context nutzen kann.

    wieso ist das so?

    (danke...ist mir eh peinlich, es nicht mehr zu wissen)


    import java.awt.Component;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowListener;

    import javax.swing.JButton;
    import javax.swing.JFrame;


    public class FrameBsp implements ActionListener{

    /**
    * @param args
    */


    public static void main(String[] args) {


    JFrame frame = new JFrame("Mein Fenster");

    //2. Optional: What happens when the frame closes?
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //JButton startButton = new JButton("ok");

    JButton button = new JButton("ok");

    frame.getContentPane().add(new JButton("OK"));

    button.addActionListener(new ActionListener(this));


    //4. Size the frame.
    frame.pack();

    //5. Show it.
    frame.setVisible(true);


    }

    public void actionPerformed(ActionEvent arg0) {
    // TODO Auto-generated method stub
    System.out.println("OK");
    }

    }

    }

  • this beschreibt das Objekt. Statische Methoden kommen auch ohne dessen Objekt, in dem es deklariert und implementiert wird, aus.

    Der Verweis in dieser statischen Methode auf das this Objekt wird also fehlschlagen, weil (noch) kein Objekt existiert.

    Ich hoffe, das war verständlich erklärt.

  • schauen wir mal, ob ich es verstanden habe :)

    (ich dachte immer, this meint die klasse, bzw das objekt der klasse, in dem es verwendet wird?)

    also, der "scope" von "this" geht nicht über die methode, in der es verwendet wird, hinaus. richtig?

    wenn ich also this im konstruktor verwenden würde, würde es sich auf das initialisierte objekt beziehen, dass durch den aufruf dieses konstruktors erschaffen wird.


    wenn ich aber this in einer statischen methode aufrufe, würde es sich auf das statische objekt beziehen, - da meine klasse aber nicht statisch ist, bzw ihr das "static class" fehlt, könnte der compiler das zur statischen methode gehörende statische objekt nicht finden.

    richtig?


  • (ich dachte immer, this meint die klasse, bzw das objekt der klasse, in dem es verwendet wird?)


    Ist auch richtig so.


    also, der "scope" von "this" geht nicht über die methode, in der es verwendet wird, hinaus. richtig?


    Das versteh ich nicht ganz, was du damit meinst. This bezieht sich auf das ganze Objekt und ist in jeder Methode des instanzierten Objektes verwendbar. Siehe dazu auch dein vorheriges & nachfolgendes Kommentar.


    wenn ich also this im konstruktor verwenden würde, würde es sich auf das initialisierte objekt beziehen, dass durch den aufruf dieses konstruktors erschaffen wird.



    Und zuletzt ...


    wenn ich aber this in einer statischen methode aufrufe, würde es sich auf das statische objekt beziehen, - da meine klasse aber nicht statisch ist, bzw ihr das "static class" fehlt, könnte der compiler das zur statischen methode gehörende statische objekt nicht finden.

    richtig?



    Auch richtig.

  • ad scope:

    naja, ganz einfach: this bezieht sich auf das instaniierte objekt (normalerweise). this könnte sich aber auch auf ein statisches objekt/klasse beziehen. jenachdem, wo ich es aufrufe (scope)

    mein problem entsteht ja während dem aufruf einer statischen methode. ich will in einer statischen methode ein instanziiertes objekt mit "this" verwenden. da die statische methode aber eben statisch ist, und nicht "instanziierter teil des instanziierten objektes", tut sich diese statische methode schwer, irgendeine instanz "ihrer" klasse zu verwenden.

    aber ich glaub, jetzt kenn ich mich selbst nicht mehr aus und der satz ist auch nicht deutsch :eek2:

  • Egal, um es auf dein Problem zu konkretisieren. Dimitrij hats ja schon angedeutet.

    Du verwendest das this in der main Methode! In der Main Methode gibt es aber kein this. Du mußt die entsprechende Klasse angeben, die die Actions abarbeiten soll. Verständlich?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!