java中addMouseListener(this)中的this是指啥?怎么好多方法都有this ,this具体指啥,求详解!!

如题所述

this是指您正在编写的这个类,在软件运行时(运行时)所实例化的对象。

Swing程序可以说是基于“事件”的程序。所谓“事件”是指程序运行时所发生的事情,包括图形界面的用户交互操作、Swing组件内部对某事件的连续反应所产生的其他事件、某种情况下所发生的自定义事件。

运行时的事件是一个事件对象,它有三个要素:1、事件源是谁,也就是说是在哪个Swing组件中产生的这个事件;2、事件内部所包含的数据,我们可以将一些重要数据封装在事件中;3、有那些监听器对象负责处理这个事件。

总体来讲,一个事件只有一个事件源,可以有0或多个负责处理这个事件的监听器。

事件源负责向外抛出事件,抛出事件就是在告知添加到此事件源的所有监听器,这个事件已经被抛出,已被添加到此事件源负责处理该事件的监听器应该开始处理该事件了。

综上所述,只有将监听器添加到事件源上,当事件被事件源抛出后,才可能会有监听器处理此事件。从你的例子来看,这是在向当前类(事件源)添加一个鼠标事件监听器(此监听器还是当前类的实例)。

重复一下,只有将监听器添加到事件源上,当事件被事件源抛出后,才可能会有监听器处理此事件。

你必须清晰认识到:事件源、事件、监听器是围绕事件的三个不同概念。

作为初学者,很少有机会手动写抛出事件的代码。比如鼠标事件作为Java内部定义好的事件,当用户鼠标在界面中执行任何动作(如移位、点击、拖动等等等等),都会由Java已经封装好的、支持鼠标事件的组件作为事件源,向外抛出鼠标事件。组件(事件源)抛出事件后,应该由添加到此事件源的鼠标事件监听器处理此事件。

一般来讲,Java已经封装好了很多内置事件监听器的接口和实现类,要处理某事件,必须创建一个监听器类,使其实现处理此事件监听器的接口或继承处理此事件监听器的实现类。追问

“类的当前实例与类对象不是同一概念,他们指向的对象不相同”

这句话对吗?能解释一下吗?

追答

类的当前实例是实例在运行时的概念,所谓运行时是指程序运行的时候。比如说,在程序运行时,A类被实例化成为10个对象,这10个对象都是A类实例。而类的当前实例是指实例本身说的,如这10个对象是a1,a2...a10,a1作为A类实例,a1当前实例就是a1自己。a1的this就是a1,不是其它的(如a2,a3...a10)。
可即便理解了以上的解释,也许你还会问,那a1,a2...a10都是A的实例,又有什么联系和区别呢?你可以这样理解这个问题,类的概念是确定了它的实例有哪些属性,并为这些属性赋予了默认值(非基本数据类型的属性默认值可能是null),且确定了实例的行为(方法)逻辑。但是,类的实例在运行时,属性值可能被改变。与之相反的,实例在运行时,它的行为逻辑是肯定与类的行为实现保持一致。换句话说,类的实例之间,行为一致,属性一致,但属性的值不尽一致;由于行为逻辑与属性值相关,所以实例行为发生后的结果也不尽一致。也就是说,a1,a2...a10的属性值可能不完全一致,但是他们的属性定义、行为逻辑都是一致的,行为发生后的结果不一定一致。
总而言之,this是指这个类被实例化后的实例(对象)自己。a1的this就是a1,不是a2,a3...a10。
如果还是不懂,我们可以这样讲,人是一个类,它有属性,姓名、年龄、健康程度;有行为,说话、行走。张三、李四、王五都是人的实例,张三姓名属性值为张三,年龄属性值为18,健康程度属性值为良好;李四姓名属性值为李四,年龄属性值为20,健康程度属性值为口吃;王五姓名属性值为王五,年龄属性值为30,健康程度属性值为瘸子。无论张三、李四、王五,他们的“说”行为逻辑都被人这个类确定好了,肺部出气,声带振动,口腔共鸣;“行走”行为逻辑也被人这个类确定好了,大腿动、小退动,掌握平衡。但是,说和行走这两个行为逻辑虽然一样,但都与健康程度属性值有关,所以张三正常说话、正常行走;李四说话口吃,行走正常;王五说话正常,行走跌瘸。张三的this是张三自己,this的属性值、行为逻辑、行为结果均与张三一致。
对于张三这个实例来讲,人这个类的实例的当前实例是张三。
人这个类的类实例有张三、李四、王五。
类的当前实例是针对实例本身讲的;类的实例是指代所有从这个类实例化出来的所有对象。当前实例和类实例不是一个领域里面的概念。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-28
this是指当前类的实例,addMouseListener是指给当前的实例指定一个能处理鼠标事件的实例,这里用this,是指由当前实例处理。追问

就是说addMouseListener在哪个类里,this就指哪个类的实例对吧?

还有this是一个监听器对象吗?怎么理解监听器对象??

追答

是,this就是那个类的实例。

this就是个监听器对象,监听器对象就是实现了特定监听方法的实体类对象。
这是一种设计模式,比如一个Frame,你想在鼠标移动时做点什么,可是设计Frame本身时并不知道你将来做什么,于是它接收到鼠标移动事件时,就委托给监听对象来实现,于是设计了监听接口类,你只要实现了监听接口类的特定方法,Frame就能调用

追问

就是说
举个简单例子:pulic class A implements ActionListener{
……
Button button;
button.addActionListener(this);
……
}其中的this是指类A的实例,而不是类Button的实例,对吧?还有this可以用类的对象代替吗??

追答

对,this是指类A的实例,而不是类Button的实例

this是可以用类的对象代替的

追问

在网上查了会,说:“类的当前实例与类对象不是同一概念,他们指向的对象不相同”。

这对吗?下面这个程序我将this换为类的对象,没报错,但运行不出之前的效果:

//实现在appletviewer中鼠标简单的作画程序

package applet;


import java.applet.Applet;

import java.awt.*;

import java.awt.event.*;

追答

“类的当前实例与类对象不是同一概念,他们指向的对象不相同”,这句话没错,但是this是类对象的特例;你的程序用法也对,但是你的程序有毛病啊,只能画一个点

第2个回答  2013-08-28
指的是当前对象,也就是你之前新建的对象名称,用this访问对象的属性,比如this.后面是对象的属性