在Java中有两个非常特殊的关键字:this和super,它们在使用前都是不需要声明的。this关键字使用在一个成员函数的内部,指向当前对象,当前对象指的是调用当前正在执行方法的那个对象。super关键字是直接指向超类的构造函数,用来引用超类中的变量和方法。下面介绍一下this的使用方法。
先看下面的一段代码。
class PersonInformation
{
String name,gender,nationality,address;
int age;
void PersonInformation(String p_name,String p_gender,String pnationality,String p_address,int p_age){
name=p_name;
gender=p_gender;
nationality=p nationality;
address=p address;
age=p age;
}
}
在Personlnformation()函数中,这个对象的方法提示可以直接访问对象的成员变量,而且在同一个范围中,定义两个相同名字的局部变量是不被允许的。如果确实想使类的成员变量与方法的参数或方法自己定义的局部变量同名,就需要想一种方法使成员变量与跟它同名的方法参数或局部变量区分开来,这就要使用到this变量。下面改写一下上面的代码,使PersonInformation类的构造函数中每个参数都有与对象成员变量相同的名字,而成员变量的初值由参数给出。
class PersonInformation
{
String name,gender,nationality,address;
int age;
void PersonInformation(String p_name,String p_gender,String pnationality,String p_address,int p_age){
this.name=p_name;
this.gender=p_gender;
this. nationality=p nationality;
this.address=p address;
this.age=p age;
}
}
从上例中可以看出,该构造函数中必须使用this。this在方法体中用来指向引用当前正在执行方法的那个对象实例。在上例中,我们要区别参数name和成员变量name,写成name=name显然是不允许的。在参数或局部变量名与类成员变量名相同的时候,由于参数或局部变量的优先级高,这样在方法体中参数名或局部变量名将隐藏同名的成员变量,因此,为了指明成员变量,必须使用this显式地指明当前对象。
有时候会遇到这种情况,全面访问当前对象,而不是访问某一个个别的实例对象,此时也可以使用this,并利用Java中的toString0方法(它能够返回一个描述这个对象的字符串)。如果把任何一个对象传递到System.out.println方法中,这个方法调用这个对象的toString方法,并打印出结果字符串,所以,可以用System.out.println(this)方法来打印出固有参数的当前状态。
this还有一个用法,就是构造函数的第一个语句,它的形式是this(参数表),这个构造函数就会调用同一个类的另一个相对的构造函数。请看下面的例子。
class UserInfo {
private String name;
private int number;
public UserInfo(String name) {
this(name, 1);
}
public UserInfo(String name,int number){
this.name=name;
this.number=number;
}
}
如果调用UserInfor newinfotable=new UserInfo(“Wayne Zheng”),就会自动调用UserInfo(String name,int number)构造函数。
可见,熟练掌握this在Java程序设计过程中是非常重要的。