考虑下面这个类别:
public class Ball {
private double radius;
private String name;
public Ball() {
this(0.0, "no name");
}
public Ball(double radius, String name) {
this.radius = radius;
this.name = name;
}
public double getRadius() {
return radius;
}
public double getVolumn() {
return (4 / 3 * Math.PI * radius * radius * radius);
}
public String getName() {
return name;
}
public void setRadius(double radius) {
this.radius = radius;
}
public void setName(String name) {
this.name = name;
}
}
当使用这个类别新增两个对象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()一个应用的基本范例,如此,您不用在建构方法中撰写重复的程序代码。