
5.5 this关键字
this描述的是本类结构调用的关键字,在Java中this关键字可以描述3种结构的调用。
当前类中的属性:this.属性。
当前类中的方法(普通方法、构造方法):this()、this.方法名称()。
描述当前对象。
5.5.1 this调用本类属性

当通过setter()或者是构造方法为类中的成员设置内容时,为了可以清楚地描述出具体参数与成员属性的关系,往往会使用同样的名称,那么此时就需要通过this来描述类的成员属性。
范例:通过“this.成员属性”访问

在本程序提供的构造方法中所采用的参数名称与类成员属性名称完全相同,所以为了明确标记出操作的是本类成员属性,就需要通过关键字this来设置。
提示:调用属性时要加上this。
在日后的所有开发中,为了避免不必要的bug出现,本书建议:只要是调用类中成员属性的情况,都要使用“this.属性”的方式来进行表示。
5.5.2 this调用本类方法

在现在所学习的Java内容中,一个类里会有两种方法定义:普通方法、构造方法,这样在一个类中如果要想实现本类方法的调用,就可以通过this关键字来实现。
调用本类普通方法:可以使用“this.方法()”调用,并且可以在构造方法与普通方法中使用。
调用本类构造方法:调用本类其他构造方法使用this()形式,此语句只允许放在构造方法首行使用。
范例:使用this调用本类普通方法

本程序在构造方法中调用了本类中的普通方法,由于是在本类,所以是否使用this没有明确的要求,但是从标准性的角度来讲还是采用“this.方法()”的形式更加合理。
当一个类中存在有若干个构造方法时也可以利用this()的形式实现构造方法之间的相互调用,但是需要记住的是,该语句只能够放在构造方法的首行。
范例:使用this()实现本类构造方法的相互调用


本程序定义了3个构造方法,并且这3个构造方法之间可以进行相互调用,即双参构造调用单参构造,单参构造调用无参构造,这样不管调用哪个构造方法都可以进行提示信息的输出。
注意:在使用this调用构造方法的时候要注意以下问题。
(1)所有类的构造方法是在对象实例化的时候被默认调用,而且是在调用普通方法之前调用,所以使用this()调用构造方法的操作,一定要放在构造方法的首行。
范例:错误的构造方法调用

本程序在调用构造方法的时候一个是没有放在构造方法的首行,另外一个是放在了首行,而getInfo()方法不是构造方法,所以程序编译的时候出现了语法错误提示。
(2)如果一个类中存在了多个构造方法的话,并且这些构造方法都使用了this()相互调用,那么至少要保留一个构造方法没有调用其他构造,以作为程序的出口。
范例:错误的构造方法调用

本程序虽然符合了构造方法调用时要放在构造方法首行这一要求,但是却出现了构造方法的递归调用,所以此操作依然不正确。
构造方法的相互调用最主要的目的是提升构造方法中执行代码的可重用性,为了更好地说明这个问题,下面通过一个构造方法的案例来进行说明。现在要求定义一个描述有员工信息的程序类,该类中提供有编号、姓名、部门、工资,在这个类中提供有4个构造方法。
【无参构造】编号定义为1000,姓名定义为无名氏,其他内容均为默认值。
【单参构造】传递编号,姓名定义为“新员工”,部门定义为“未定”,工资为0.0。
【三参构造】传递编号、姓名、部门,工资为2500.00。
【四参构造】所有的属性全部进行传递。
范例:利用构造方法相互调用实现代码重用


本程序利用构造方法的相互调用实现了属性赋值操作的简化处理,这样可以节约多次的赋值操作语句,使得代码结构清晰,调用方便。
5.5.3 this表示当前对象

一个类可以实例化出若干个对象,这些对象都可以调用类中提供的方法,那么对于当前正在访问类中方法的对象就可以称为当前对象,而this就可以描述出这种当前对象的概念。
提示:对象输出问题。
实际上所有的引用数据类型都是可以打印输出的,默认情况下输出会出现一个对象的编码信息,这一点在下面的范例中可以看见,在本书第8章中会为读者详细解释对象打印问题。

范例:观察当前对象

本程序实例化了两个Message类的对象,并且分别调用了printThis()方法,通过执行的结果可以发现,类中的this会随着执行对象的不同而表示不同的实例。而对于之前所讲解的“this.属性”这一操作,严格意义上来讲指的就是调用当前对象中的属性。
为了帮助读者进一步理解this表示当前对象这一概念,下面通过一个简单的模拟程序来进行深入分析。本次实现一个消息发送的处理,在进行消息具体发送的操作之前应该先进行连接的创建,连接创建成功之后才可以进行消息内容的推送,具体的实现如下。
范例:实现消息发送逻辑


本程序在Channel类的内部实例化了Message类对象,由于消息的发送需要通过通道来实现,所以将Channel的当前对象this传递到了Message类,并且利用Message.send()方法实现消息发送处理。
5.5.4 综合案例:简单Java类

简单Java类指的是可以描述某一类信息的程序类,例如,描述个人信息、描述书信息、描述部门信息等,并且在这个类之中并没有特别复杂的逻辑操作,只作为一种信息保存的媒介存在。对于简单Java类而言,其核心的开发结构如下。
类名称一定要有意义,可以明确地描述某一类事物。
类中的所有属性都必须使用private进行封装,封装后的属性必须提供setter()、getter()方法。
类中可以提供有无数多个构造方法,但是必须保留无参构造方法。
类中不允许出现任何输出语句,所有内容的获取必须返回。
【可选】可以提供一个获取对象详细信息的方法,暂时将此方法名称定义为getInfo()。
提示:简单Java类的开发很重要。
这里学习简单Java类不仅仅是对之前概念的总结,更是使之成为以后项目开发的重要组成部分。每一个读者都必须清楚地记下给出的开发要求,在随后的章节中也将对此概念进行进一步的延伸与扩展。
同时,简单Java类也有许多名称,例如,POJO(Plain Ordinary Java Object,普通Java对象)、VO(Value Object,值对象)、PO(Persistent Object,持久化对象)、TO(Transfer Object,传输对象),这些类定义结构类似,概念上只有些许的区别,读者先有个印象即可。
范例:定义一个描述部门的简单Java类


本程序定义的Dept类并没有复杂的业务逻辑,只是一个可以描述部门信息的基础类。在使用简单Java类的过程中,往往就是进行对象实例化、设置内容、获取内容等几个核心操作。