深入Java关键字this的用法的总结
在Java程序设计中经常会见到this的使用,this使得程序设计变得规范、简单、灵活。但是在使用过程中,在不同场
合它的含义并不完全相同,使用不当还会出现错误,
本文对this的几种用法和出现的问题进行了分析详解。
关键词:类;对象;this;成员变量;方法;构造方法
中,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) {
- http://www.wenkuxiazai.com=name; //将形 参的值传递给成员变量 }
- public String getName( ) { return "姓名:"+name; }}
这时,代表的就是类中的成员变量,而赋值号右边的name则是方法的形式参数,代码name就是将形
式参数的值传递给成员变量。
例1只是以一个形式参数为例。其实如果是局部变量的话,也是相同的道理。在方法体内定义的变量称为局部变量,在类的内部方法体的外部定义的变量称为成员变量。如果成员变量和方法中的局部变
量的名字相同时,那么在方法中成员变量将会被屏蔽。如果这个时候还要使用成员变量,就需要使用关键字this。使用this引用成员变量的方法格式:this.成员变量名。
既然this能够调用本类中的成员变量,那么,this也可以调用本类中的成员方法。以例2为例,程序代码如下:
- class Student
- { private String name;
- public void setName(String name)
- { this.print();//调用本类中的print方法
- }
- 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
其他方法引用构造方法一样,都是通过形式参数来调用构造方
法。Java编译器会根据所传递的参数数量的不同,来判断该调用哪个构造方法。
所以,我们在实际编程的时候有时候需要在一个构造方法中对另一个构造方法进行调用。但是,在使用this关键字调用其他构造方法的时候,this()调用构造方法只能放在构造方法的首行,为的是能
够为类中的属性初始化;而且至少有一个构造方法是不用this调用,否则程序会出现错误。
- class Student
- {
- ) ;//调用有两个参数的构造方法
- System.out.println("新对象实例化") ; } public Student (String name) {
- this() ;
- }
- public Student (String name,int age) { this(name) ;
- this.age = age ; } public String getInfo(){
- return "姓名:" + name + ",年龄:" + age ; }}
- public class ThisExample05
- { ) ;
- 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) ; //直接打印对象
- { private String name //姓名
- private int age ; //年龄
- public Student (){// 无参构造System.out.println("新对象实例化") ; } public Student (String name)
- { System.out.println("新对象实例化") ;
- } public Student (String name,int age) // 通过构造方法赋值
- { System.out.println("新对象实例化") ; //为类中的name属性赋值
- this.age = age ; //为类中的age属性赋值 } public String getInfo(){//取得信息的方法return "姓名:" + name + ",年龄:" + age ; }}
- public class ThisExample03
- { ) ; //调用构造实例化对象
- 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() ; //调用本类中的无参构造方法
- http://www.wenkuxiazai.com = 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 = ) ; System.out.println(stu1.getInfo()) ; }
- }
一个类中有多个构造方法,因为其名字都相同,跟类名一致,那么这个this到底是调用哪个构造方法呢?
stu2.getInfo() ; // 当前调用getInfo()方法
}}
我们再用一个例子来解释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){ //设置姓名
- } public void setAge(int age){ //设置年龄 this.age = age ; } public String getName(){
- return; }
- 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(equals()&&s1.age==s2.age){
- return true ; //两个对象相等 }else{ return false ; //两个对象不相等 } }
- public void setName(String name){ //设置姓名 ; }
- public void setAge
- (int age){ //设置年龄 this.age = age ; }
- public String getName(){ return; } public int getAge(){ return this.age ; }}
- public class ThisExample07
- { public static void main(String args[]) {
- Student stu1 = ) ; //声明两个对象,内容完全相等
- Student stu2 = ) ; //声明两个对象,内容完全相等
- // 直接在主方法中依次取得各个属性进行比较
- if(stu1.compare(stu2)){
- System.out.println("两个对象相等!") ;
- }else{ System.out.println("两个对象不相等!") ;
- } }}
地址相等,则两个对象相等;如果地址不相等,则依次判断每一个属性的内容来判断其是否相等。
结束语:Java中的this与面向对象的程序设计密切相关,它表示当前对象。
但是,在不同的使用场合它表示的真正含义是不完全一样的。this.成员变量、this.成员方法(参数列表):实际上都表示当
前对象中的属性或当前对象调用的方法;this的核心表示当前对象,当前正在操作本方法的对象称为当前对象;使用this可以调用其他构造方法,但是此语句必须放在构造方法的首行
this的使用在 节省代码、区分局部变量与成员变量、对象的比较等方面起着重要的作用,编程时我们应当给予重视并能够学会正确使用它。
深入Java关键字this的用法的总结的更多相关文章
- Java关键字this的用法总结
大飞_Rflyee:http://blog.csdn.net/rflyee/article/details/12057289 首先了解一下java中类的引用, 对于java中类的引用,可以这样理解: ...
- (转载)深入Java关键字this的用法的总结
在Java程序设计中经常会见到this的使用,this使得程序设计变得规范.简单.灵活.但是在使用过程中,在不同场 合它的含义并不完全相同,使用不当还会出现错误, 本文对this的几种用法和出现的问题 ...
- 【Java学习笔记之二十】final关键字在Java继承中的用法小结
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...
- java基础 -- 关键字static的用法
static关键字的基本作用就是方便在没有创建对象的情况下调用类的方法/变量, static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问. static ...
- Java关键字
Java关键字简介 类别 关键字 说明 访问控制 private 私有的 protected 受保护的 public 公共的 类.方法和变量修饰符 abstract 声明抽象 class 类 exte ...
- Java关键字this、super使用总结
版权声明:原创作品,如需转载,请与作者联系.否则将追究法律责任. 作者:熔岩日期:2007-03-01MSN :leizhimin@126.com声明:原创作品,未经授权,谢绝转载! 好久没有对所学知 ...
- Java关键字介绍之this与super
1.什么是super?什么是this? super关键字表示超(父)类的意思.this变量代表对象本身. 2.使用super&this调用成员变量和方法 可以使用super访问父类被子类隐藏的 ...
- Java关键字及其作用
Java关键字及其作用 一. 关键字总览 访问控制 private protected public 类,方法和变量修饰符 abstract class extends fin ...
- 【Java学习笔记之一】java关键字及作用
Java关键字及其作用 一. 总览: 访问控制 private protected public 类,方法和变量修饰符 abstract class extends final implements ...
随机推荐
- js中的DOM事件与对象
概念图 document.getElementById("bb"); 根据id找到bb,只能找一个哦 var aa = document.getElementById(" ...
- 用css画出三角形
看到有面试题里会有问到如何用css画出三角形 众所周知好多图形都可以拆分成三角形,所以说会了画三角形就可以画出很多有意思的形状 画出三角形的原理是调整border(边框)的四个方向的宽度,线条样式以及 ...
- 浅谈HTML5单页面架构(一)——requirejs + angular + angular-route
心血来潮,打算结合实际开发的经验,浅谈一下HTML5单页面App或网页的架构. 众所周知,现在移动Webapp越来越多,例如天猫.京东.国美这些都是很好的例子.而在Webapp中,又要数单页面架构体验 ...
- web安全测试资料
最近因为工作需要,整理了安全测试工具AppScan的一个教程.目录如下: 网上对于appscan的资料挺多,但是也很乱很杂.不利于系统的学习,这也是我为什么整理这样一份指导手册. 在这份手册里,主要包 ...
- UML基础系列:类图
类图描述系统中类的静态结构,它不仅定义系统中的类,描述类之间的联系,如关联.依赖.聚合等,还包括类的内部结构(类的属性和操作).类图描述的是静态关系,在系统的整个生命周期中都是有效的.对象图是类图的实 ...
- 关于SubSonic3.0生成的表名自动加复数(s)的“用户代码未处理SqlException,对象名'xxxs'无效”异常处理
使用SubSonic3.0模版生成时,同2.2版本一样,都会自动在一些类似数据库要用到的关键后面加要s(复数),这里也是3.0的一个小Bug,在查询时由于插件并没有完全的去掉s,所以会产生“用户代码未 ...
- 三行代码接入,社交软件打字时底下弹出的表情布局,自定义ViewPager+页面点标+各种功能的android小框架。
(转载请声明出处:http://www.cnblogs.com/linguanh/) 前言: 接上次分享的 ListView 动态加载类,入口:http://www.cnblogs.com/lingu ...
- 把《c++ primer》读薄(4-1 c和c++数组)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. c和c++的数组和指针都属于低级的复合数据类型,比如c++的数组,类似vector容器,指针类似迭代器.低级的数据类型优势是速度 ...
- JS魔法堂:Data URI Scheme介绍
一.前言 上周五公司内部的Any Topic Conf.上我和同事们分享了这个主题,有同事说这个有用,有同事说这个没啥用,后来还延伸到网站性能的话题上,大家讨论的激烈程度让我觉得这次选题还不错.本篇先 ...
- Oracle 11gR2 RAC修改监听默认端口
一.修改SCAN listener port 1.1 修改SCAN listener port 1.2 重启SCAN listener生效新端口 1.3 确认更改 二.修改Listener Ports ...