【正文】 

我是立志要掌握Java编程语言的一名小白,最近我在学习Java中的面向对象的三大特性(封装、继承、多态)时,常常会碰到this关键词,但书上只是简单讲了this的几个作用,我听得是云里雾里,并没有讲解Java设计者为什么要创建this关键字,是出于一个什么原因创建了this关键字呢?还有this关键字解决了什么问题呢?

这些都是我的疑惑,至于我为什么问到这些问题,是因为我觉得学习概念不仅仅要学习概念的本身,更重要的是了解、理解知识的由来。

黄博主的回答:

各位,你们好!我刚开始学习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关键字?我将用一段代码来说明原因。

 1 class Person{2      public void speak(){3           System.out.println("某一个对象去调用方法");4     }5     6     public static void main(String[] args){7       Person p1=new Person();8       Person p2=new Person();9       p1.speak();     //p1对象去调用speak()方法
10       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学习过程中遇到云里雾里的问题,尽管给我留言,只要是我能弄明白的,一定平铺直叙地讲清楚,希望我做错的地方,大家积极各位指出来,大家一起学习,一起进步。学习一门语言,要多思考、常总结是不错的状态,多交流。黄博主期待在这里与你共勉!

转载于:https://www.cnblogs.com/hzp0619/p/8969994.html

Java关键字---this的由来和其三大作用相关推荐

  1. 2020年Java程序员不得不学习的10大技术

    对于Java开发人员来说,最近几年的时间中,Java生态诞生了很多东西.每6个月更新一次Java版本,以及发布很多流行的框架,如Spring 5.Spring Security 5和Spring Bo ...

  2. Java关键字final、static、this、super使用总结

    一.final 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理 ...

  3. 转!Java关键字final、static使用总结

    Java关键字final.static使用总结 一.final 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义,它可以修饰非 ...

  4. [Java] 关键字final、static使用总结

    一.final 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理 ...

  5. 【Java学习笔记之一】java关键字及作用

    Java关键字及其作用 一. 总览: 1 访问控制 2 private protected public 3 4 类,方法和变量修饰符 5 abstract class extends final i ...

  6. java语言语法--- Java标识符(标识符命名规则)、Java关键字、Java变量(变量的声明、赋值、使用)和常量(字符常量、字面常量)(包括Java字节码文件反汇编命令javap)

    java语言语法- Java标识符.Java关键字.Java变量和常量(包括Java字节码文件反汇编命令javap) 1.标识符 (1)读音:biao zhi fu (2)什么是标识符? (摘自百度百 ...

  7. Java 关键字—— static 与 final

      static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被stat ...

  8. 10.java 关键字与保留字

    Java 关键字列表 (依字母排序 共51组)所有的关键字都是小写. 在IDE中都会显示不同的颜色: abstract, assert, boolean, break, byte, case, cat ...

  9. 原创 | 2020年Java程序员应该学习的10大技术

    对于Java开发人员来说,最近几年的时间中,Java生态诞生了很多东西.每6个月更新一次Java版本,以及发布很多流行的框架,如Spring 5.Spring Security 5和Spring Bo ...

最新文章

  1. C2065 “__m128d”: 未声明的标识符
  2. 重磅!商汤港中文等将开源ECCV2018MS COCO检测比赛冠军代码库
  3. TabLayout+ViewPager更新fragment的ui数据
  4. java如何保证redis设置过期时间的原子性_redis专题系列22 -- 如何优雅的基于redis实现分布式锁
  5. Fedora 31 已经为 Python 3.8 做好了准备
  6. 常用的几个JQuery代码片段
  7. 多种交换机端口镜像 Port Mirroring 配置
  8. 基于HFSS阵列天线设计
  9. 基于Web的教学网站前端开发设计 报告+任务书+html源码
  10. xlsx.js导出表格设置批注框根据内容自动全部显示的解决办法
  11. 灰度持续加仓,FIL即将大涨
  12. 两个表格合并怎么做?
  13. 从校园人到职业人的转变
  14. shapely中几何对象
  15. Hibernate tools的hbm2ddl和hbm2java
  16. 作为亚马逊小白卖家不建议盲目进入亚马逊市场
  17. 图片地址正确但是无法显示问题
  18. KONG网关 — KongA管理UI使用
  19. 程序员提前下班的福音来了!GitHub、OpenAI 联手推出 AI 代码生成神器
  20. 硬纪元AI峰会前瞻:火爆的无人驾驶还将有哪些深度创新?

热门文章

  1. python输出由1234组成的三位素数_编写程序,输出所有由 1 、 2 、 3 、 4 这 4 个数字组成的素数,并且在每个素数中每个数字只使用依次。_学小易找答案...
  2. 如何实现按钮水平居中
  3. Maven多个mudule只编译、打包指定module
  4. Android开发笔记(一百一十九)工具栏ToolBar
  5. Android开发笔记(十九)底部标签栏TabBar
  6. mysql row 格式binlog 恢复_为什么要把MySQL的binlog格式修改为row
  7. ios中amplify配置configure_Asp.netCore3.0 简单的webapi接口 (中)
  8. 详解REST架构风格
  9. 编译安装Apache、php、xcache、FastCGI及相关整合
  10. Node.js+Express商业开发中的安全性考虑