2013-10-13 3 views
1

Je suis nouveau sur Java/Android. Je ne comprends pas le "ceci" dans addActionListener (this). J'ai lu beaucoup de livres et le forum, mais je confonds toujours les suivantes:Que fait ce mot clé "this" dans Java ".addActionListener (this)"

Quelqu'un explique: « ce » est un refernce à l'objet courant »

Enregistrer une instance de la classe gestionnaire d'événements comme listenser . sur un ou plusieurs composants someComponent.addActionListener (instanceofMyClass);

OK, je comprends, il est un objet d'une classe

Cependant, quelqu'un explique: "ce" représente une œuvre et ins. ActionListener tantiated, qui se trouve être votre classe.

Alors "ceci" peut être un objet d'une classe et aussi une "classe". C'est ce que je ne comprends pas.

Est-ce que quelqu'un m'expliquerait clairement? Merci!

+1

'this' n'est pas une classe, jamais. C'est toujours un objet, l'objet * current * toujours. –

Répondre

1

Voici ce qui se passe. Dans l'exemple ci-dessous, SomeClass implémente l'interface ActionListener qui n'a qu'une seule méthode (actionPerformed qui prend en argument un objet ActionEvent) qui doit être implémentée. Cependant, pour implémenter cette méthode, vous avez besoin d'un objet. "This" fait référence à un objet de SomeClass.

public class SomeClass implements ActionListener{ 

    SomeClass(){ 
    Button aButton = new Button("Click Me"); 
    aButton.addActionListener(this); 
    } 

    public static void main(String[] args) { 
     SomeClass object = new SomeClass(); 
    } 

    public void actionPerformed(ActionEvent e) { 
    //do Something when user clicks the button 
    } 
} 
+0

cela fait référence à un objet de SomeClass. Cependant, nous n'avons pas créé d'objet? Aucun 'nouveau' n'est utilisé – user1232250

+1

J'ai ajouté la méthode principale pour le rendre clair. – lochi

+1

@ user1232250: Ce code ne sera pas exécuté tant que vous n'aurez pas créé une instance de SomeClass. – kcoppock

2

This fait toujours référence à l'objet courant, ce n'est pas une classe. Parfois, les gens disent injustement classe quand ils signifient objet, c'est tout.

+0

Salut j'ai un doute concernant ce s'il vous plaît se référer à ce [exemple] (http://stackoverflow.com/a/18585247/3228960) note la ligne dans ON CREATE MyButton m = new MyButton (this); comme vous l'avez dit, cela fait référence à l'objet, mais dans le constructeur de la classe MyButton, il est typecasted à Interface comment cela se passe-t-il? Ma compréhension est comme il a passé ceci (un objet) ainsi dans le constructeur il devrait mentionner un objet (objet de MyActivity) pas une interface. Désolé si cela vous dérange comme une question stupide. –

+1

@srujan maddula Dans ce contexte, 'ml' est un objet de n'importe quelle classe qui implémente l'interface' MyListener'. Son appelé [polymorphisme] (http://stackoverflow.com/a/3110318/2180290). –

2

"this" fait référence à l'objet actuel, puisque Java utilise des méthodes pour changer les objets. Ainsi, lorsque vous appelez "ceci" dans votre activité, vous donnez à votre méthode quelque chose à changer.

Votre code "someComponent.addActionListener (instanceofMyClass);" fait exactement la même chose. Vous prenez l'objet "someComponent" et utilisez la méthode "addActionListener". Le ActionListener va alors se demander où il va obtenir le code d'écoute, et vous déclarez que vous voulez qu'il soit appelé à partir de "instanceofMyClass", qui pourrait être permuté avec "this"

Vous pourriez trouver une autre explication avec code ici: What is the meaning of "this" in Java?

+0

Donc, si cela se réfère toujours à un objet courant, quel est l'objet courant? Il n'y a aucun objet créé. Si je crée un bouton, est-ce que le bouton est l'objet courant quand quelqu'un appuie sur le bouton? – user1232250

+0

Si vous appelez "this", il référencera l'objet créé par le constructeur, dont le constructeur est SomeClass(). Une fois que vous avez la référence à l'objet SomeClass(), vous pouvez utiliser ses méthodes/variables. Quand quelqu'un clique sur un bouton et que vous appelez "this.method()", cela ferait la même chose que "method" dans votre classe. Je recommande simplement d'ajouter quelques variables et déconner avec "ceci" et seulement les variables seules. Faites quelques variables globales et locales et voyez ce qui se passe. –

1

Dans votre cas, "ceci" est à la fois "une référence à l'objet actuel" et "une implémentation qui implémente l'interface ActionListener". Cela signifie que la classe englobante ("this" stand by) devrait implémenter l'interface ActionListener. Ainsi, quand on clique sur someComponent (ou d'autres actions), la classe englobante sera invoquée pour traiter l'événement.

Vous pouvez consulter ci-dessous le code pour obtenir l'idée: « ce » représente une instance de YourClass qui met en œuvre le ActionListener

public YourClass implements ActionListener 
{ 
    private someComponent; 
    public YourClass() 
    { 
    someComponent = new Component(); 
    someComponent.addActionListener(this); 
    } 

    public void actionPerformed() 
    { 
    //add code to process the event 
    } 
} 
+0

Alors, quel est l'objet actuel? – user1232250

+0

lorsque j'implémente une interface, un objet sera créé? – user1232250

+0

"this" représente une instance de YourClass qui implémente le ActionListener, quelle est l'instance de YourClass? SomeComponent? – user1232250

Questions connexes