IT技术基础篇聊聊Java中的this关键字
前言
在很早的时候,我曾试图通过网上的资源去更全面的了解Java中this的作用,但很遗憾不是没有,而是没有一篇看了能清晰的文章,内容都一样,毕竟this关键字也确实只有那么点东西可以聊的,但是是真的乱,希望这篇文章不是在内容而是在组织与呈现更到位些吧。概念
this关键字只能在方法内部使用,表示对"调用方法的那个对象"的引用。概念就这么简单,其实它与我们前面提到的引用没有区别,就是当前所属对象的引用。契机
既然this关键字与普通引用一样,为什么要设计这么一个关键字呢?假设创建了某个对象同时要拥有该对象的引用,我们再操作对象的属性或方法是一件很简单的事情,但是如果我需要在该对象的某个方法内部使用当前对象的引用进行其它操作呢?每定义一个需要内部使用当前对象引用的方法时,将其引用做为形参?显然这种方式略显傻瓜了。
还是那句话,我们使用者能想到的问题,那么操碎心的开发者会发现不了么。其实在我们调用每个方法时开发者都设计成了隐藏式的将当前其引用做为第一个形参传递到了方法内部(当然这一步是编译器替我们实现的)。如此一来这个隐藏式的形参在使用者需要明确使用时发现对于它并没有一个明确的标识符,this关键字就诞生了。使用属性
通过上图咱们可以发现在showInfo方法中使用name时显式的使用this,而age使用时并无显式使用this。没有错showInfo这个方法的使用必须伴随着Person这个类的对象创建并由其引用进行操作,就如同上文说到的,在使用showInfo时,编译器就会将其改造为showInfo(引用)。方法
通过上图咱们又换了一种写法,就是在使用name和age时是通过调用方法来获取的,同直接使用属性一样,在使用方法时也可显式使用this,亦可以省略。构造方法
如上图,咱们在使用构造方法时,如果给this加上了形参,那么它的意义就改变了,它代表着要复用其它重构的构造方法。在这里咱们用四个例子说明下其使用上的区别:问题一
可以看到问题一位置是一个无参构造方法,通过new Person();创建出来的对象,它的name与age是完全一样的,在其内部通过this("无名氏", 999);复用了全参构造方法,这种使用是为在设计上达到复用代码的目的,否就要像同题四中一样,将其代码重复写一次。问题二和问题三
这里咱们结合二和三两个问题一起看,这两个位置其实均可以如问题一中一样调用全参构造方法,但是呢这个问题在问题一中已经展示过了,这里呢咱们讲的是另一外一个点位,对比会发现,二和三中均直接给name进行了赋值操作,但二中使用了this而三中并没有使用,这就要说到另一个原则了"就近原则 ",二与三的区别在于name在二中做为形参传递,如果二中没有显式指定this.name进行赋值,就会根据就近原则这个值就重新赋值给了形参,而不会对于对象属性有任何影响。
注:通过上述代码还可看出在构造方法中通过this引用其它构造方法时,开发者规定必须放在方法的第一行同时仅能调用一次。如果调用完仍需对某些属性赋值就要像问题二中一样,单独处理。 方法返回
写法一
写法二
这种使用是针对在方法执行结束将其对象的引用以返回内容的形式传递出来供后续操作继续使用,这里咱们对于Person这个类的toString方法通过之前提到的StringBuilder来拼接实现。这就让代码优雅和直观,毕竟在这里就如同看到了输出语句的格式一样。总结
在上述提及到的this使用中,属性引用相关的其实站在开发者角度来讲他们是不期望我们来显式调用的,相反处处在显式使用那就失去了高级语言帮我们做的一些工作的意义,更或者会对于那些无如此代码风格的人也是一种干扰。
在工作中,构造方法规避就近引起赋值失效与方法返回引用这两点上使用意义还是很大而且频繁的。
另外有仔细的人会发现StringBuilder的append方法中存在super的使用,这个就咱们明天要唠的话题,明儿见您。