在Java程序设计中经常会见到this的使用,this使得程序设计变得规范、简单、灵活。但是在使用过程中,在不同场合它的含义并不完全相同,使用不当还会出现错误。中培伟业《JAVA高级开发技术实战》培训专家龚老师在这里对this的几种用法和出现的问题进行了分析详解。
龚老师指出,Java语言中,当创建一个对象后,Java虚拟机就会为其分配一个指向对象本身的指针,这个指针就是“this”。关键字this与对象密切相 关,在Java程序设计中经常会见到this的使用,我们很多人很难理解它,因为它的语法较为灵活,那this到底有哪些用处呢?什么情况下使用它呢?本文就具体来分析一下this的使用方法。
一、使用this调用本类中的成员变量(属性)
通过name=name并没有正确的将内容赋给属性,为什么呢?因为此时操作的name实际上是方法中的,跟类中的属性完全不沾边。
另外,这个程序代码中,有一个成员变量name,同时在方法中有个形式参数,参数名也是name。然后在方法中将形式参数name的值传递给成员变量name。虽然我们可以看明白这个代码的含义,但是作 为Java编译器它是怎么判断使用哪个变量的呢?到底是将形式参数name的值传递给成员变量name,还是反过来讲成员变量name的值传递给形式参数name呢?
此时this这个关键字就起到作用了,这种情 况下使用this这个关键字代表的就是类中的成员变量,又叫做类的属性。所以此时,为了明确的表示出哪一个是类中的属性,就要加上“this.属性名称”的操作
这时,代表的就是类中的成员变量,而赋值号右边的name则是方法的形式参数,代码name就是将形式参数的值传递给成员变量。
其实如果是局部变量的话,也是相同的道理。在方法体内定义的变量称为局部变量,在类的内部方法体的外部定义的变量称为成员变量。如果成员变量和方法中的局部变量的名字相同时,那么在方法中成员变量将会被屏蔽。如果这个时候还要使用成员变量,就需要使用关键字this。使用this引用成员变量的方法格式:this.成员变量名。
既然this能够调用本类中的成员变量,那么,this也可以调用本类中的成员方法。
一般情况下,在Java语言中引用成员变量或者成员方法都是以对象名.成员变量或者对象名.成员方法的形式。不过有些程序员即使在没有相同变量的时候,也喜欢使用this.成员变量的形式来引用变量
这主要是从便于代码的阅读考虑。一看到这个this关键字就知道现在引用的变量是成员变量或者成员方法,而不是局部变量。这无形中就提高了代码的阅读性。
二、使用this调用构造方法
在一个Java类中,构造方法是一个与类同名的方法,必须与类的名字相同。而且在Java类中必须存在一个构造方法。如果在代码中没有显示的体现构造方法的话,那么编译器在编译的时候会自动添加 一个没有形式参数的构造方法。在一个类中可以存在多个构造方法,这些构造方法都采用相同的名字,只是形式参数不同。
Java语言就凭用户的参数来判断调用哪一个构造方法。当一个类中有多个构 造方法时,可以利用this关键字相互调用。假设,现在有一个类中存在多个构造方法,但是不管有多少个构造方法,只要对象一被实例化,就必须打印一句“新对象实例化”的信息出来,这时可以有两种做法。
其他方法引用构造方法一样,都是通过形式参数来调用构造方法。Java编译器会根据所传递的参数数量的不同,来判断该调用哪个构造方法。
所以,我们在实际编程的时候有时候需要在一个构造方法中对另一个构造方法进行调用。但是,在使用this关键字调用其他构造方法的时候,this()调用构造方法只能放在构造方法的首行,为的是能 够为类中的属性初始化;而且至少有一个构造方法是不用this调用,否则程序会出现错误。
注意的是,使用this调用构造方法只适用于构造方法的调用,类中的其他方法不能使用这种方法。
三、使用this引用当前对象
this最重要的特定就是表示当前对象,那什么叫当前对象呢?在Java中当前对象就是指当前正在调用类中方法的对象。使用this引用当前对象是指如果在类的方法中需要返回一个对象,并且该对象是方法所在的类的当前对象,可以使用this关键字作为方法的返回值。
一个无参的构造方法,一个提供一个参数用于设置姓名的构造方法,还有一个提供两个参数用于设置姓名和年龄的构造方法,这三个方法都是用来打印新对象实例化的信息,很明显,此 时如果在各个构造方法中编写输出语句肯定是不合适的,其中有一些代码重复了,现在只是一行,所以感觉不出来,如果现在的代码有很多行的话,以上代码的缺陷就立刻显现出来了。那么,最好让 构造方法间进行相互的调用,这时就可以用“this(参数列表)”的形式完成
这里定义了一个返回类型为Car类型的方法getCarObject(),并使用this关键字返回当前的对象Car。在main()方法中创建一个Car对象并使用instanceof方法判断getCarObject()方法返回的对象与Car 对象是否匹配。运行结果为true。
四、其他用法
除了上述情况外,this还可以用在其他场合。例如对象的比较,可以使用this和引用传递进行两个对象是否相等的判断。结束语:Java中的this与面向对象的程序设计密切相关,它表示当前对象。
但是,在不同的使用场合它表示的真正含义是不完全一样的。this.成员变量、this.成员方法(参数列表):实际上都表示当 前对象中的属性或当前对象调用的方法;this的核心表示当前对象,当前正在操作本方法的对象称为当前对象;使用this可以调用其他构造方法,但是此语句必须放在构造方法的首行this的使用在节省代码、区分局部变量与成员变量、对象的比较等方面起着重要的作用,编程时我们应当给予重视并能够学会正确使用它。