Java语言中this关键字的用法详解


转自

文/王丽丽 史红艳 褚梅

摘 要: 在Java程序设计中经常会见到this的使用,this使得程序设计变得规范、简单、灵活。但是在使用过程中,在不同场
合它的含义并不完全相同,使用不当还会出现错误,本文对this的几种用法和出现的问题进行了分析详解。
关键词: 类;对象;this;成员变量;方法;构造方法
中图分类号: TP311 文献标识码: A 文章编号: 1006-4117(2010)11-0213-03
Java语言提供了丰富的类( Class)、接口( Interface)以及
相应的方法( Method)。使用这些类或接口,用户可以定义自
己的类或子类,并以这些类为模板创建对象( Object)。在Java
语言中,当创建一个对象后, Java虚拟机就会为其分配一个指向
对象本身的指针,这个指针就是“ this”。关键字this与对象密切
相关,在Java程序设计中经常会见到this的使用,我们很多人很
难理解它,因为它的语法较为灵活,那this到底有哪些用处呢?
什么情况下使用它呢?本文就具体来分析一下this的使用方法。
一、使用this调用本类中的成员变量(属性)
例1:观察以下的程序代码,看看会出现哪些问题呢?
class Student
{ private String name; //定义一个成员变量name
public void setName(String name) {//设置姓名,定义
一个形参name
name=name; //将局部变量的值传递给成员变量
}
public String getName( ) {//获得姓名
return "姓名:"+name;
}
}
public class ThisExample01
{ public static void main(String args[])
{ Student stu=new Student();
stu.setName("李明");
System.out.println(stu.getName());
}
}
运行结果:姓名:null
由运行结果可以看出,通过name=name并没有正确的将内
容赋给属性,为什么呢?因为此时操作的name实际上是方法中
的,跟类中的属性完全不沾边。
另外,这个程序代码中,有一个成员变量name,同时在方
法中有个形式参数,参数名也是name。然后在方法中将形式参
数name的值传递给成员变量name。虽然我们可以看明白这个代
码的含义,但是作为Java编译器它是怎么判断使用哪个变量的
呢?到底是将形式参数name的值传递给成员变量name,还是反
过来讲成员变量name的值传递给形式参数name呢?此时this这个
关键字就起到作用了,这种情况下使用this这个关键字代表的就
是类中的成员变量,又叫做类的属性。所以此时,为了明确的表
示出哪一个是类中的属性,就要加上“ this.属性名称”的操作,
将student类的代码改进如下:
class Student
{ private String name;
public void setName(String name) {
this.name=name; //将形参的值传递给成员变量
}
public String getName( ) {
return "姓名:"+name;
}
}
这时,this.name代表的就是类中的成员变量,而赋值号右
边的name则是方法的形式参数,代码this.name=name就是将形
式参数的值传递给成员变量。
例1只是以一个形式参数为例。其实如果是局部变量的话,
也是相同的道理。在方法体内定义的变量称为局部变量,在类的
内部方法体的外部定义的变量称为成员变量。如果成员变量和方
法中的局部变量的名字相同时,那么在方法中成员变量将会被屏
蔽。如果这个时候还要使用成员变量,就需要使用关键字this。
使用this引用成员变量的方法格式:this.成员变量名。
既然this能够调用本类中的成员变量,那么, this也可以调用
本类中的成员方法。以例2为例,程序代码如下:
class Student
{ private String name;
public void setName(String name)
{ this.print();//调用本类中的print方法
this.name=name;
}
public String getName( ) {
return "姓名:"+name;
}
public void print( ) {
System.out.println("设置相关信息如下……");
}
}
public class ThisExample02
{ public static void main(String args[])
{ Student stu=new Student();
stu.setName("李明");
System.out.println(stu.getName());
}
}
运行结果:
设置相关信息如下……
李明
一般情况下,在Java语言中引用成员变量或者成员方法都是
以对象名.成员变量或者对象名.成员方法的形式。不过有些程序
员即使在没有相同变量的时候,也喜欢使用this.成员变量的形式
来引用变量。这主要是从便于代码的阅读考虑。一看到这个this
关键字就知道现在引用的变量是成员变量或者成员方法,而不是
局部变量。这无形中就提高了代码的阅读性。
二、使用this调用构造方法
在一个Java类中,构造方法是一个与类同名的方法,必须与
类的名字相同。而且在Java类中必须存在一个构造方法。如果在
代码中没有显示的体现构造方法的话,那么编译器在编译的时候
会自动添加一个没有形式参数的构造方法。在一个类中可以存在
多个构造方法,这些构造方法都采用相同的名字,只是形式参数
不同。Java语言就凭用户的参数来判断调用哪一个构造方法。当
一个类中有多个构造方法时,可以利用this关键字相互调用。假
设,现在有一个类中存在多个构造方法,但是不管有多少个构造
方法,只要对象一被实例化,就必须打印一句“新对象实例化”
的信息出来,这时可以有两种做法。
第一种做法:按照最原始的方式完成,具体代码如下:
class Student
科教纵横
214 2010.11 WWW.W8818.COM
2010年 第11期
{ private String name ; //姓名
private int age ; //年龄
public Student (){// 无参构造
System.out.println("新对象实例化") ;
}
public Student (String name)
{ System.out.println("新对象实例化") ;
this.name = name ;
}
public Student (String name,int age) // 通过构造方
法赋值
{ System.out.println("新对象实例化") ;
this.name = name ; //为类中的name属性
赋值
this.age = age ; //为类中的age属性赋值
}
public String getInfo(){//取得信息的方法
return "姓名:" + name + ",年龄:" + age ;
}
}
public class ThisExample03
{ public static void main(String args[])
{ Student stu1 = new Student ("李明",20) ;
//调用构造实例化对象
System.out.println(stu1.getInfo()) ; //取得
信息
}
}
这个例子中,一个无参的构造方法,一个提供一个参数用于
设置姓名的构造方法,还有一个提供两个参数用于设置姓名和年
龄的构造方法,这三个方法都是用来打印新对象实例化的信息,
很明显,此时如果在各个构造方法中编写输出语句肯定是不合适
的,其中有一些代码重复了,现在只是一行,所以感觉不出来,
如果现在的代码有很多行的话,以上代码的缺陷就立刻显现出
来了。那么,最好让构造方法间进行相互的调用,这时就可以用
“this(参数列表)”的形式完成,用this修改以上的代码如下:
class Student
{ private String name ;
private int age ;
public Student(){
System.out.println("新对象实例化") ;
}
public Student (String name)
{ this() ; //调用本类中的无参构造方法
this.name = name ;
}
public Student (String name,int age)
{ this(name); //调用有一个参数的构造方法
this.age = age ;
}
public String getInfo(){ //取得信息的方法
return "姓名:" + name + ",年龄:" +
age ;
}
}
public class ThisExample04
{ public static void main(String args[])
{ Student stu1 = new Student ("李明",20) ;
System.out.println(stu1.getInfo()) ;
}
}
一个类中有多个构造方法,因为其名字都相同,跟类名一
致,那么这个this到底是调用哪个构造方法呢?其实,这跟采用
其他方法引用构造方法一样,都是通过形式参数来调用构造方
法。Java编译器会根据所传递的参数数量的不同,来判断该调用
哪个构造方法。
所以,我们在实际编程的时候有时候需要在一个构造方法中
对另一个构造方法进行调用。但是,在使用this关键字调用其他
构造方法的时候,this()调用构造方法只能放在构造方法的首行,
为的是能够为类中的属性初始化;而且至少有一个构造方法是不
用this调用,否则程序会出现错误。
class Student
{ private String name ;
private int age ;
public Student ()
{ this("李明",20) ;//调用有两个参数的构造方

System.out.println("新对象实例化") ;
}
public Student (String name)
{ this() ;
this.name = name ;
}
public Student (String name,int age)
{ this(name) ;
this.age = age ;
}
public String getInfo(){
return "姓名:" + name + ",年龄:" + age ;
}
}
public class ThisExample05
{ public static void main(String args[])
{ Student stu1 = new Student ("李小明",19)
;
System.out.println(stu1.getInfo()) ;
}
}
这时候构造方法就出现了递归调用,程序出错。
注意的是,使用this调用构造方法只适用于构造方法的调
用,类中的其他方法不能使用这种方法。
三、使用this引用当前对象
this最重要的特定就是表示当前对象,那什么叫当前对象
呢?在Java中当前对象就是指当前正在调用类中方法的对象。使
用this引用当前对象是指如果在类的方法中需要返回一个对象,
并且该对象是方法所在的类的当前对象,可以使用this关键字作
为方法的返回值。例如:
class Student
{ public String getInfo()//取得信息的方法
{ System.out.println("Student类 --> " + this) ; // 直
接打印this
return null ; //为了保证语法正确,返回null
}
}
public class ThisExample06{
public static void main(String args[])
{ Student stu1 = new Student();//调用构造实
例化对象
Student stu2 = new Student();//调用构造实
例化对象
System.out.println("MAIN方法 --> "
+stu1) ; //直接打印对象
stu1.getInfo() ; // 当前调用getInfo()方法
的对象是stu1
System.out.println("MAIN方法 --> "
+stu2) ; //直接打印对象
科教纵横
WWW.W8818.COM 2010.11 215
2010年 第11期
stu2.getInfo() ; // 当前调用getInfo()方法
的对象是stu2
}
}
我们再用一个例子来解释this引用当前对象。
public class Car
{ public Car getCarObject(){
return this; //返回当前对象
}
public static void main(String[] args)
{ Car sc = new Car ();//创建一个Car对象
System.out.println( sc.getCarObject()
instanceof Car);
}
}
这里定义了一个返回类型为Car类型的方法getCarObject(),
并使用this关键字返回当前的对象Car。在main()方法中创建一个
Car对象并使用instanceof方法判断getCarObject()方法返回的对象
与Car对象是否匹配。运行结果为true。
四、其他用法
除了上述情况外, this还可以用在其他场合。例如对象的比
较,可以使用this和引用传递进行两个对象是否相等的判断。例
如,一个学生类如下:
class Student
{ private String name ;
private int age ;
public Student (String name,int age)
{ this.setName(name) ;
this.setAge(age) ;
}
public void setName(String name){ //设置姓名
this.name = name ;
}
public void setAge(int age){ //设置年龄
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
}
生成两个对象,当两个对象中的姓名和年龄完全相等的时
候,则认为对象相等,但是在此时就产生了两个问题:一是如何
进行对象的比较?二是在哪里进行比较?这个例子中姓名定义为
String类型,我们知道String本身事一个类,如果想要进行相等
的比较,则要判断内容是否相等,必须使用equals()方法完成。
而年龄age定义为整型,直接使用“==”就可以完成。另外,对
象的比较应该由自己进行比较最为合适,所以应该在Student类
中增加一个比较的方法,具体代码如下:
class Student
{ private String name ;
private int age ;
public Student (String name,int age)
{ this.setName(name) ;
this.setAge(age) ;
}
public boolean compare(Student stu)
{ //调用此方法时里面存在两个对象:当前对
象、传入的对象
Student s1 = this ;//当前的对象,就表示
stu1
Student s2 = stu ;//传递进来的对象,就表
示stu2
if(s1==s2){// 判断是不是同一个对象,用地
址比较
return true ;
}
//之后分别判断每一个属性是否相等
if(s1.name.equals(s2.name)&&s1.age==s2.
age){
return true ; //两个对象相等
}else{
return false ; //两个对象不相等
}
}
public void setName(String name){ //设置姓名
this.name = name ;
}
public void setAge(int age){ //设置年龄
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
}
public class ThisExample07
{ public static void main(String args[])
{ Student stu1 = new Student ("李明",20) ;
//声明两个对象,内容完全相等
Student stu2 = new Student ("李明",20) ;
//声明两个对象,内容完全相等
// 直接在主方法中依次取得各个属性进行比

if(stu1.compare(stu2)){
System.out.println("两个对象相
等!") ;
}else{
System.out.println("两个对象不相
等!") ;
}
}
}
地址相等,则两个对象相等;如果地址不相等,则依次判断
每一个属性的内容来判断其是否相等。
结束语: Java中的this与面向对象的程序设计密切相关,它
表示当前对象。但是,在不同的使用场合它表示的真正含义是
不完全一样的。 this.成员变量、 this.成员方法(参数列表):实际
上都表示当前对象中的属性或当前对象调用的方法; this的核心
表示当前对象,当前正在操作本方法的对象称为当前对象;使用
this可以调用其他构造方法,但是此语句必须放在构造方法的首
行。this的使用在节省代码、区分局部变量与成员变量、对象的
比较等方面起着重要的作用,编程时我们应当给予重视并能够学
会正确使用它。
作者单位:徐州空军学院基础部
参考文献:
[1]辛运帏,饶一梅编著.《Java程序设计教程》.机械工业出版社,2007年8月.
[2]孙浏毅等编著.《Java宝典》.电子工业出版社,2009年8月.
[3]刘万军,郑少京等编著.《Java 6 程序设计》.清华大学出版社,2009年5月.
科教纵横
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值