考虑下面这个类:
public class Ball { 当使用这个类新增两个对象ball1与ball2时,ball1与ball2会各自拥有自己的radius与name数据成员,然而方法成员在记忆 体中却只有一份。 当使用ball1.getName()与b2.getName()方法取回name的名称时,即然类的方法成员只有一份,getName()如何知 道它传回的name是ball1对象的,还是ball2对象的呢? 其实您使用对象名称来调用方法成员时,程序会将对象的引用告知方法成员,而在方法中,一个类数据成员其实会隐含一个this引用,这个this参 考会储存传递进来的对象引用,当您调用getRadius()函数时,其实相当于执行: public double getRadius() {
return this.radius; } 当ball1调用getRadius()方法时,this所引用的就是ball1所引用的对象,而使用ball2调用 getRadius()方法时,this所引用的就是ball2所引用的对象,所以getRadius()可以正确的得知该传回哪一个对象的radius 数据。 每一个类的方法成员都会隐含一个this引用,用来指向调用它的对象,当您在方法中使用数据成员时,都会隐含的使用this指标,当然您也可以明确的指定,例如在函数定义时使用: public Ball(double radius, String name) {
this.radius = radius; this.name = name; } 参数名称与数据成员名称相同时,为了识别是参数或是数据成员,我们必须明确的使用this引用来指定,但如果是下例则不用: public Ball(double r, String n) {
radius = r; // 实际等于this.radius = r; name = n; // 实际等于this.name = n; } 再介绍一个this引用的使用时机:当对象需要得知自己的内存位址时。这种例子很多,例如告知某个函数处理对象为自己、或在Java视窗程序中,注册对象本身为事件处理者,例如下面这个简单的Java程序中就有使用到this引用: public class GUIExample extends JFrame
implements MouseListener { // .... // 实现事件处理的对象为自已 addMouseListener(this); // .... // == 滑鼠事件实现 == public void mouseEntered(MouseEvent e) { // ..... } // .... } 这只是一个示范,告知您this引用的用法,如果日后您学到Java视窗程序的事件处理,相信这样的例子您会看到不少。 this除了上面的用法之外,还有一种可以带参数的用法,主要是用于类中调用构造方法,而避免直接以构造方法的名称来调用,例如: public class Ball {
private String name; public Ball() { this("No name"); .... } public Ball(String name) { this.name = name; .... } } 当使用无参数的构造方法时,它会调用有参数的构造方法,这是this()一个应用的基本范例,如此,您不用在构造方法中撰写重覆的程序码。 |