Java开发笔记(四十七)关键字this的用法
前面介绍了类的基本定义,包括成员属性、成员方法、构造方法几个组成要素,可谓是具备了类的完整封装形态。不过在进行下一阶段的学习之前,有必要梳理一下前述的类定义代码,看看是否存在哪些需要优化的地方。
首先观察以下的代码片段,主要是重量属性的定义及其设置方法:
// 定义了橘子的重量
private double weight; // 设置橘子的重量
public void setWeight(double inputWeight) {
weight = inputWeight;
}
注意到setWeight方法的输入参数名叫inputWeight,而重量属性的名称则为weight,之所以给参数名与属性名分配不同的名称,是因为在setWeight方法里面,蹦出一个名叫weight的家伙,编译器焉知这是名叫weight的输入参数,还是名叫weight的成员属性?事实上,对于名称一样的输入参数和成员属性,该方法内部只会把这个weight当作输入参数,而非成员属性。这就带来一个问题:万一不幸遇到参数名与属性名相同的情况,如何才能在方法内部操作同名的成员属性?为此Java提供了this关键字,它用于指代当前类自身,于是“this.变量名”就表示该类指定名称的成员属性了。如此一来,处理橘子重量的相关代码便可改成下面这样:
// 定义了橘子的重量
private double weight; // 设置橘子的重量
public void setWeight(double weight) {
this.weight = weight;
}
关键字this不仅用于修饰成员属性,也能用于修饰成员方法,且看以下的构造方法代码:
// 只有一个输入参数的构造方法
public OrangeThis(String inputPlace) {
place = inputPlace;
if (place.equals("淮北")) {
name = "枳子";
} else {
name = "橘子";
}
}
可见该构造方法的内部代码只是设置橘子的产地,顺带修改橘子的名称,其作用等同于setPlace这个成员方法。故而以上的构造方法完全可以简化成下面这般:
// 只有一个输入参数的构造方法
public OrangeThis(String place) {
// 调用该类的成员方法
this.setPlace(place);
}
由于此处setPlace指的必定是成员方法setPlace,而不可能是别的什么东西,因此这里的前缀“this.”可加可不加,不加也没有任何不良影响。所以类内部调用成员方法通常不加关键字this,此时构造方法的代码如下所示:
// 只有一个输入参数的构造方法
public OrangeThis(String place) {
// 调用该类的成员方法
setPlace(place);
// 此时成员方法前面的this可加可不加,即使不加也不会产生歧义
//this.setPlace(place);
}
再来看以下的另一个构造方法,它拥有三个输入参数:
// 拥有三个输入参数的构造方法
public OrangeThis(String inputPlace, double inputWeight, boolean inputRipe) {
place = inputPlace;
if (place.equals("淮北")) {
name = "枳子";
} else {
name = "橘子";
}
weight = inputWeight;
isRipe = inputRipe;
}
以上的构造方法,内部代码的前半部分仍旧是设置橘子产地并修改橘子名称,其功能与前述的构造方法“OrangeThis(String place)”雷同。既然前面的构造方法已经实现了同样的功能,后面的构造方法不妨直接调用前一个构造方法,这时依然利用关键字this代替构造方法之前的类名,譬如语句“this();”表示调用当前类默认的构造方法。那么依样画瓢,语句“this(place);”表达的便是拥有一个输入参数的构造方法了,这下可将原先带三个输入参数的构造方法改写成如下代码:
// 拥有三个输入参数的构造方法
public OrangeThis(String place, double weight, boolean isRipe) {
// 在一个构造方法中调用另一个构造方法,不能直接写类的名称,而要使用this指代构造方法
this(place);
this.weight = weight;
this.isRipe = isRipe;
}
现在好了,不但类的局部代码得到了简化,并且实现了方法复用,从而增强了代码的可维护性。
更多Java技术文章参见《Java开发笔记(序)章节目录》
Java开发笔记(四十七)关键字this的用法的更多相关文章
- Java开发笔记(十七)各得其所的多路分支
前面提到条件语句的标准格式为“if (条件) { /* 条件成立时的操作代码 */ } else { /* 条件不成立时的操作代码 */ }”,乍看之下仿佛只有两个分支,一个是条件成立时的分支,另一个 ...
- Java开发笔记(序)章节目录
现将本博客的Java学习文章整理成以下笔记目录,方便查阅. 第一章 初识JavaJava开发笔记(一)第一个Java程序Java开发笔记(二)Java工程的帝国区划Java开发笔记(三)Java帝国的 ...
- Java开发笔记(四十九)关键字super的用法
前面介绍了如何从Bird类继承而来Swallow类,按道理子类应当继承父类的所有要素,但是对于构造方法来说,Swallow类仅仅继承了Bird类的默认构造方法,并未自动继承带参数的构造方法.如果子类想 ...
- Java开发笔记(二十七)数值包装类型
方法的出现缘起优化代码结构,但它的意义并不局限于此,正因为有了方法定义,编程语言才更像一门能解决实际问题的工具,而不仅仅是只能用于加减乘除的计算器.在数学的发展过程中,为了表示四则运算,人们创造了加减 ...
- Java开发笔记(三十四)字符串的赋值及类型转换
不管是基本的char字符型,还是包装字符类型Character,它们的每个变量只能存放一个字符,无法满足对一串字符的加工.为了能够直接操作一连串的字符,Java设计了专门的字符串类型String,该类 ...
- Java开发笔记(四十五)成员属性与成员方法
前面介绍了许多数据类型,除了基本类型如整型int.双精度型double.布尔型boolean之外,还有高级一些的如包装整型Integer.字符串类型String.本地日期类型LocalDate等等,那 ...
- Java开发笔记(四十一)日历工具Calendar
前面的文章提到,Date是Java最早的日期工具,估计当时的设计师是个技术宅男,未经过充分调研就拍脑袋写下了Date的源码,造成该工具存在先天不足,比如getYear方法返回的不是纯正的公元纪年.ge ...
- Java开发笔记(四十二)日历工具的常见应用
前面介绍了日历工具Calendar的基本用法,乍看起来Calendar与Date两个半斤八两,似乎没有多大区别,那又何苦庸人自扰鼓捣一个新玩意呢?显然这样小瞧了Calendar,其实它的作用大着呢,接 ...
- Java开发笔记(四十六)类的构造方法
前面介绍了如何定义一个简单的类,以及它的成员属性和成员方法,从示例代码可以看到,不管是OrangeSimple还是OrangeMember,都要先利用关键字new创建一个实例,然后才能通过实例名称访问 ...
随机推荐
- Could not resolve placeholder 'IMAGE_SERVER_URL' in string value "${IMAGE_SERVER_URL}"
这种问题 在网上查的是说使用了重复的property-placeholder 可能是在别的xml 也用了property-placeholder 解决方法 加上 ignore-unresolva ...
- hadoop伪分布式搭建
安装好jdk 减压hadoop压缩包 cd /home/hadoop/hadoop-2.7.3/etc/hadoop vi hadoop-env.sh 文件末尾处添加 jdk环境变量 export J ...
- 刚发现 CSS 还存在一个命名规范 B.E.M
Block !误区:这个block并非inline-block里的block,而是将所有东西都划分为一个独立的模块,一个header是block,header里嵌套的搜索框是block,甚至一个ico ...
- MemCache详细解读
MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...
- Mysql优化之索引和字段
Mysql优化是一个老生常谈的问题, 优化的方向也优化很多:从架构层;从设计层;从存储层;从SQL语句层; 今天讲解一下从索引和字段: 字段优化: ① 尽量使用TINYINT.SMALLINT.ME ...
- 微信小程序实现图片是上传、预览功能
本文实例讲述了微信小程序实现图片上传.删除和预览功能的方法,分享给大家供大家参考,具体如下: 这里主要介绍一下微信小程序的图片上传图片删除和图片预览 1.可以调用相机也可以从本地相册选择 2.本地实现 ...
- Python档案袋( Socket 与 ScoketServer 通信 )
Socket有一个缓冲区,缓冲区是一个流,先进先出,发送和取出的可自定义大小的,如果取出的数据未取完缓冲区,则可能存在数据怠慢.其中[recv(1024)]表示从缓冲区里取最大为1024个字节,但实际 ...
- 【Spark篇】--Spark中的宽窄依赖和Stage的划分
一.前述 RDD之间有一系列的依赖关系,依赖关系又分为窄依赖和宽依赖. Spark中的Stage其实就是一组并行的任务,任务是一个个的task . 二.具体细节 窄依赖 父RDD和子RDD parti ...
- Java String:重要到别人只能当老二的字符串类
字符串,是Java中最重要的类.这句肯定的推断不是Java之父詹姆斯·高斯林说的,而是沉默王二说的,因此你不必怀疑它的准确性. 关于字符串,有很多的面试题,但我总觉得理论知识绕来绕去没多大意思.你比如 ...
- jenkins修改数据存放路径
如果是用tomcat做容器的话,则在./bin/catalina.sh文件添加以下语句即可:export JENKINS_HOME="存放路径(需存在)" 例如: