Java关键字---this的由来和其三大作用
【声明】欢迎转载,但请保留文章原始出处→_→
秦学苦练:http://www.cnblogs.com/Qinstudy/
文章来源:http://www.cnblogs.com/Qinstudy/p/Qinstudy.html
【正文】
秦学苦练博主,你好!我是立志要掌握Java编程语言的一名小白,最近我在学习Java中的面向对象的三大特性(封装、继承、多态)时,常常会碰到this关键词,但书上只是简单讲了this的几个作用,我听得是云里雾里,并没有讲解Java设计者为什么要创建this关键字,是出于一个什么原因创建了this关键字呢?还有this关键字解决了什么问题呢?
这些都是我的疑惑,至于我为什么问到这些问题,是因为我觉得学习概念不仅仅要学习概念的本身,更重要的是了解、理解知识的由来。再次拜谢博主啦----秦学苦练
Java初学者——小张
秦学苦练的回答:
小张,你好!我刚开始学习this时,也只知道this关键字在程序中有哪些作用,但不知道this关键字怎么产生的?你讲的这句话很好--学习概念不仅仅要学习概念的本身,更重要的是了解、理解知识的由来。
你提出了两个问题,我把问题罗列出来:
1.Java设计者为什么要创建this关键字,是出于一个什么原因创建了this关键字呢? 简言之,this关键字产生的背景
2.还有this关键字解决了什么问题呢? 简言之,this关键字的作用
受“更重要的是了解、理解知识的由来”的鼓舞,我去网上查阅了相关资料,《Java编程思想》(第四版第5章5.4,P84页)给出了不错的回答。下面我把书中的知识按照自己的理解讲述一下:
this关键字可以这么去理解,在英语中,指示代词this,用来指代某个东西,例如:Look,this is a table. this指代table。
在Java语言的设计中,this也是具有指向关系的。
1. this关键字产生的背景
我先来回答,Java设计人员为什么创建了this关键字?我将用一段代码来说明原因。
class Person{
public void speak(){
System.out.println("某一个对象去调用方法");
}
public static void main(String[] args){
Person p1=new Person();
Person p2=new Person();
p1.speak(); //p1对象去调用speak()方法
p2.speak(); //p2对象去调用speak()方法
11 }
(亲测)运行结果:
某一个对象去调用方法
某一个对象去调用方法
但是,当只有一个speak()方法,编译器如何知道speak()方法是被p1还是被p2所调用的呢?为了能用简便、面向对象的语法来编写代码--即“发送消息给对象”,编译器做了一些幕后工作。它暗自把”所操作对象的引用”作为第一个参数传递给speak()方法。所以上述调用后的方法变成了这样:
Person speak(p1);
Person speak(p2);
这是内部的表现形式。如果我们这样写,编译器会报错,但这种写法会帮助你去理解编译器所做的事。假设你希望在方法的内部获得对当前对象的引用,由于这个引用是编译器“偷偷”传入的,所以没有标识符可用。
于是,为了解决‘在方法的内部获得对当前对象的引用’这一背景问题,Java设计师专门设计了this关键字,用来在方法的内部获得对当前对象的引用。this关键字只能在方法内部使用,表示对"调用方法的那个对象“的引用。可以这么说,this的用法和其他new出来对象的引用并无不同。
但要注意,如果在方法内部调用同一个类的另一个方法时,可以省略this,直接调用即可。因为当前方法中的this引用会自动应用于同一类中的其他方法。所以小张你可以这样写代码,编译器是不会报错的:
class Person{
public void speak(){}
public void eat(){
//在方法内部调用同一个类的另一个方法时,可以省略this,直接调用即可。
speak(); //编译器自动翻译成this.speak()。
}
public static void main(String[] args){
}
}
这就是this关键字为什么产生了,小张啊,总而言之,this关键字产生的背景:为了解决‘在方法的内部获得对当前对象的引用’这一问题。this关键字被设计出来了,用来在方法的内部获得对当前对象的引用。
2.this关键字的作用
三大作用:
1) 区分局部变量和成员变量同名情况,this.成员变量调用本类中的成员变量;
2)通过this.方法()调用本类中的方法;
3)this在构造方法之间的调用。
小张啊,也许你看了这三大作用,可能还是云里雾里。你在信中,说自己在学习Java中的面向对象的三大特性(封装、继承、多态),所以我认为你已经懂了private封装、extends继承,并且
知道set、get方法,和空参、有参构造方法的相关概念。下面这个程序需要你有上面的这些基础,如果你暂时没有这些基础,不用着急,先去看看这些基础。看懂这些基础后,你再回过头来,看下面的代码,你会有种豁然开朗的顿悟!
如果你已经有了上面这些基础,下面我用一个完整的程序将this关键字的三大作用讲清楚。
package day_12;
//Person类
public class Person {
private String name;
private int age; public Person(String name){//String name中的name是局部变量
// this的作用1:区分局部变量和成员变量同名情况
this.name=name; //this.name中的name是成员变量
}
public Person(String name,int age){
//作用3:this关键字在构造方法间的调用
this(name); //用this(name)去调用只有一个参数 name的构造方法
this.age=age;
} public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
} public void setAge(){
this.age=age;
}
public int getAge(){
return this.age;
}
}
package day_12;
//Worker类
public class Worker extends Person {
public Worker(String name,int age){
super(name,age); //super(name,age) 调用父类Person的具有两个参数的构造方法。
} public void work(){
//作用2:this在方法中的使用
System.out.println(this.getName()+"在砍树!");
}
}
使用this.getName() 有封装的思想在里面。由于不知道调用getName()方法的对象是谁,我就用模糊的概念,哪个对象去调用work()方法,this就指代哪个对象。
很显然,Worker类的对象wk去调用work()方法,那this就指向了wk对象。所以用this.getName()来获得wk对象中的属性:光头强。
//测试类:Test
package day_12;
public class Test {
public static void main(String[] args){
Worker wk=new Worker("光头强",28);
wk.work();
}
}
(亲测)运行结果:光头强在砍树!
3.方法论
小张,很高兴,你能提出这样两个问题,这两个问题促使我去思考this关键字产生的背景以及this的三大作用。给你讲述了this之后,我觉得自己对this的理解又加深了!小张啊,以后在Java学习过程中遇到云里雾里的问题,尽管给我写信,只要是我能弄明白的,一定平铺直叙地讲清楚。学习一门语言,多思考、常总结是不错的状态,与你共勉!
Java关键字---this的由来和其三大作用的更多相关文章
- Java关键字final、static
一.final根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final ...
- Java关键字
Java关键字简介 类别 关键字 说明 访问控制 private 私有的 protected 受保护的 public 公共的 类.方法和变量修饰符 abstract 声明抽象 class 类 exte ...
- 【转】Java关键字final、static使用总结
转自:http://lavasoft.blog.51cto.com/62575/18771/ Java关键字final.static使用总结 一.final 根据程序上下文环境, ...
- Java关键字final、static使用总结
Java关键字final.static使用总结 一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方 ...
- 转!Java关键字final、static使用总结
Java关键字final.static使用总结 一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可 ...
- Java关键字final、static使用总结(转)
Java关键字final.static使用总结 一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方 ...
- (转)Java关键字final、static使用总结
一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. fin ...
- [Java] 关键字final、static使用总结
一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率.final ...
- Java关键字及其作用
Java关键字及其作用 一. 关键字总览 访问控制 private protected public 类,方法和变量修饰符 abstract class extends fin ...
随机推荐
- Linux搭建Apache+Tomcat实现负载均衡
一.首先需要安装java,详见http://www.cnblogs.com/fun0623/p/4350004.html 二.编译安装Apache,详见http://www.cnblogs.com/f ...
- final类与final方法
inal---用于类.方法前. final类---不可被继承. final方法---不可被覆盖. final类不能被继承. 如果我们不希望一个类被继承,我们使用final来修饰这个类.这个类将无法被继 ...
- php程序报错:PHP Core Warning/cannot open shared object file: No such file or directory
今天开发调试程序的时候报错了,现象是有时候刷新会出现如下图: 这种主要是找不到共享库文件,即.so文件,网上主要有3种解决方法: 1. 用ln将需要的so文件链接到/usr/lib或者/lib这两个默 ...
- POJ-3617 Best Cow Line---字符串贪心
题目链接: https://vjudge.net/problem/POJ-3617 题目大意: 每次都可以从字符串的首部或者尾部提取字母,使得最后的字符串的字典序最小. 思路: 贪心做即可~每次从上和 ...
- POJ-1556 The Doors---线段相交+最短路
题目链接: https://vjudge.net/problem/POJ-1556 题目大意: 给一个10*10的正方形房间中间用墙隔开每个墙上有两个门,给出门的两个端点坐标求从左边中点走到右边中点所 ...
- POJ-1068 Parencodings---模拟括号的配对
题目链接: https://vjudge.net/problem/POJ-1068 题目大意: 给出一种括号序列的表示形式名叫P序列,规则是统计出每个右括号之前的左括号个数作为序列每项的值.然后要求你 ...
- bcrypt对密码加密的一些认识(学习笔记)
学习nodejs和mongoDB的时候,接触了用户注册和登录的一些知识. 1.关于增强用户密码的安全性 用户的密码肯定不能保存为明文,避免撞库攻击. 撞库攻击:撞库是一种针对数据库的攻击方式,方法是通 ...
- 搭建 springboot 2.0 mybatis 读写分离 配置区分不同环境
最近公司打算使用springboot2.0, springboot支持HTTP/2,所以提前先搭建一下环境.网上很多都在springboot1.5实现的,所以还是有些差异的.接下来咱们一块看一下. 文 ...
- 我是如何在公司项目中使用ESLint来提升代码质量的
ESLint:你认识我吗 ESLint是一个语法规则和代码风格的检查工具. 和学习所有编程语言一样,想要入门ESLint,首先要去它的官网看看:https://eslint.org/. ESLint的 ...
- ASP.NET MVC5 使用NPOI导出ExceL 返回浏览器下载
一,什么是NPOI 该项目是位于http://poi.apache.org/的POI Java项目的.NET版本.POI是一个开源项目,可以帮助您读取/写入xls,doc,ppt文件.它有着广泛的应用 ...