在Java中this关键字的作用有两个:
1.当成员变量与局部变量同名时,用来区分成员变量和局部变量;
2.在构造函数中调用构造函数。
下面我们来详细解释一下这两句话:
1.区分成员和局部变量:
有时我们为了让变量更具有语义化,经常会出现成员变量和局部变量同名的问题,这时候就要用到this了,比如以下代码:

class Word{public static void main(String[] args) {Demo d=new Demo("张三");}
}
class Demo{String name;Demo(String name){this.name=name;}
}

如果我们不加this关键字,打印出的结果是null;如果我们用this.name打印出的结果是张三,为什么呢?
当创建新对象的时候,构造函数会被自动调用,我们传的参数是“张三”,在构造函数Demo()里会定义一个名称为name的变量来接收这个数据“张三”,然后进行赋值的动作。
如果写成name=name;就相当于我们把“张三”这个值又赋给了它自己,这个栈里的变量对自己进行重写,这是毫无意义的,所以我们怎么才能把它赋值给堆里的变量name(也就是成员变量name)呢?这就要用到关键字this了。
其实每个函数里面其实都有一个默认的this引用,当对象调用函数的时候,将对象的地址赋给this关键字,此时this关键字可以指向对象,通过this就可以访问成员变量了(就是对象的属性)。用语言解释可能比较苍白,我们先举例后上图:

class Person
{private String name;private int age;    Person(String name) {this();this.name = name;}
public static void main(String[] args) {Person p = new Person("旺财");}


所以说,其实this放的是对象的地址,我们可以打印出this的结果:

class Word{public static void main(String[] args) {Demo d=new Demo();}
}
class Demo{Demo(){System.out.println(this);}
}


可以看到this的结果是一个哈希地址,@左边代表Demo类型,右边是地址(我的理解是,this就是一个万能引用变量,当函数被某种类型的对象调用时,默认的this就引用某种类型的对象,存放其地址,以此来达到指向对象,修改对象属性的目的)。
其实我们平时写函数的时候,如果局部变量没有和成员变量冲突的情况时,是可以不用写this的,因为栈中没有这个变量名,它会去堆中找这个变量,当去堆中找的时候,其实是帮我们默认加上this了,即:

    public void speak(){System.out.println(this.name+":"+this.age);}

    public void speak(){System.out.println(name+":"+age);}

是一样的,虽然我们不写,但是其实默认是有的。

2.this的第二种使用方式:在构造函数中调用另一个构造函数。
我们知道,构造函数只能在对象创建的时候调用仅调用一次,但是利用this关键字可以在构造函数中调用构造函数:

在第二个构造函数中调用第一个构造函数,如果当一个对象创建的时候调用第二个构造函数,那么此时this 就指向这个对象(可以说是这个对象的名称吧),如果this(name),可以调用第一个构造函数,此时第一个构造函数里的this也有了这个对象的地址,可以初始化对象。我们画出内存图解。

但是值得注意的一点是:调用构造函数的语句一定要写在第一行,因为构造函数的作用是初始化,不能将初始化语句放在后面。函数是一个封装体,如果传的参数进去得到另一个值,那么功能就改变了,是一种极其不严谨的行为,所以将初始化语句放在后面是会编译报错的。这也是为什么不能在普通函数中调用构造函数的原因,一定要先初始化。

this关键字的作用相关推荐

  1. 【Java_基础】Java中Native关键字的作用

    本篇博文转载与:Java中Native关键字的作用 转载于:https://www.cnblogs.com/leiblog/p/10529056.html

  2. c++语言static作用,详解c++中的 static 关键字及作用

    注:若没有特指是 静态成员时,默认都是普通成员: 1 类中的普通成员 类中的成员变量 和 成员函数 是分开存储的.其中, 1)每个对象都有独立的成员变量:成员变量可以存储在 栈空间.堆空间.全局数据区 ...

  3. volatile关键字的作用、原理

    在只有双重检查锁,没有volatile的懒加载单例模式中,由于指令重排序的问题,我确实不会拿到两个不同的单例了,但我会拿到"半个"单例. 而发挥神奇作用的volatile,可以当之 ...

  4. C++中explicit关键字的作用

    C++中explicit关键字的作用 explicit用来防止由构造函数定义的隐式转换. 要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换. ...

  5. [partial] C#里partial关键字的作用

    [partial] C#里partial关键字的作用 1. 什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中. ...

  6. 深入理解并发内存模型||JMM与内存屏障||多核并发缓存架构 ||JMM内存模型||volatile 关键字的作用 ||JMM 数据原子操作||JMM缓存不一致的问题

    深入理解并发内存模型||JMM与内存屏障 多核并发缓存架构 JMM内存模型 volatile 关键字的作用 JMM 数据原子操作 JMM缓存不一致的问题

  7. [实验]-从汇编代码来看volatile关键字的作用

    ★★★ 个人博客导读首页-点击此处 ★★★ 环境aarch64的交叉编译器 我们将C语言翻译成汇编代码,来看volatile关键字的作用 我们先看一段C语言代码 void udelay(uint64_ ...

  8. 、简述global关键字的作用_详解static inline关键字

    详解static inline关键字 本文章为知乎用户 @徐yang哟 原创,禁止抄袭! 灵感来源 在查stm32的LL库部分函数的API时,有时会查到这种函数: __STATIC_INLINE vo ...

  9. c语言 static 关键字的作用

    static 关键字的作用 全局静态变量 局部静态变量 静态函数 类的静态成员 类的静态函数 全局静态变量 在全局变量前加上关键字 static,全局变量就定义成一个全局静态变量. 静态存储区,在整个 ...

  10. C++中 static 关键字的作用

    C++中 static 关键字的作用 对于函数定义和代码块之外的变量声明,static 修改标识符的链接属性,由默 认的 external 变为 internal,作用域和存储类型不改变,这些符号只能 ...

最新文章

  1. [转]VS2015编译的程序在其他机器上缺少msvcp120.dll
  2. android获取当前应用占用的内存大小,Android分析已安装应用占用内存
  3. 【数字图像处理】四.MFC对话框绘制灰度直方图
  4. Microsoft.Practices.EnterpriseLibrary连接Oracle
  5. Data URI scheme 在 html 中嵌入小图片
  6. [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用...
  7. for ihs linux_在IBM的IHS上编译PHP(redhat 5.5 64位的环境)
  8. python制作词典软件_推荐一款非常好用的一键生成数据字典工具
  9. 更改eclipse炫酷主题
  10. 高效的敏捷测试第七课 自动化部署和BVT
  11. 计算机组装与维护研究内容,计算机组装与维护论文大纲格式模板 计算机组装与维护论文提纲怎么写...
  12. PLM系统的经济收益
  13. 自动驾驶上的三种感知传感器(激光、毫米波雷达和摄像头)优缺点比较
  14. 用Spotlight实时监控Windows Server 08
  15. 国内怎么captcha测试_通过简单的数字测试或PHP图像处理使CAPTCHA更友好
  16. “阿里/字节“大厂自动化测试面试题一般会问什么?以及技巧和答案
  17. 苹果手机中计算机功能是什么,如何将苹果11手机中的内容和隐私访问限制功能关闭...
  18. 同里古镇百年古建筑深夜被毁
  19. 小程序开发API之获取系统信息wx.getSystemInfo()、wx.getSystemInfoSync()
  20. linux cat命令缩写,linux下cat命令详解

热门文章

  1. 解决使用Glide加载图片背景出现浅绿色
  2. 修改win10更新后自动修改的浅绿色背景
  3. 【找规律】求123456789的第几个全排列
  4. EasyCaptcha图形验证码工具
  5. 千万不要和女程序员做同事!
  6. recover 没有捕获异常_Go的异常处理defer, panic, recover以及错误处理
  7. FITC-TAT-Smad7-HA融合蛋白,荧光素标记TAT-Smad7-HA融合蛋白
  8. 大数据的处理是怎样的过程
  9. Vue.js的简单趋势图
  10. Unity WebGL 发布内存优化