关于Android中this的用法解释

问题由来

由于很多同学在学习Android时候没有对Java有很深的了解,很多人都会对代码中各种各样的this产生疑惑。

以《第一行代码Android》P37页,P43页代码为例:

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.first_layout);

Button button1 = (Button) findViewById(R.id.button_1);

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);

}

});

}

有些同学会觉得非常奇怪,这个this是用来指代什么呢?是和class一样的意思吗?

那为什么FirstActivity要用this,而SecondActivity却要用class呢?

this的三种用法

1.表示对当前对象的引用

以以下代码为例:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Button play = (Button) findViewById(R.id.play);

Button stop = (Button) findViewById(R.id.stop);

play.setOnClickListener(this);

stop.setOnClickListener(this);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.play:

Videoplay();

break;

case R.id.stop:

Videostop();

break;

}

}

}

play.setOnClickListener(this)中的this,是对当前类MainActivity的引用。

那么为什么在开始的代码中要使用FirstActivity.this来引用FirstActivity呢?

我们仔细分析上下两段代码,发现this所处的类是不一样的,上面的代码中,this存在于匿名类View.OnClickListener()中!

匿名类View.OnClickListener()是FirstActivity的内部类,如果我们在内部类中使用this,他所引用的类应该是View.OnClickListener()。

Android编译器在编译我们的代码的时候就会发现:“诶View.OnClickListener()你丫谁啊?我咋从你身上启动SecondActivity啊”。然后就快乐的报错了。

所以在内部类中,如果我们需要获得其外部类,就要使用“外部类.this”的写法。

注:“.class”是因为表示其它类的写法。

2.表示用类的成员变量,而非函数参数

以以下代码为例:

public class Book {

private int id;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

}

在代码中我们定义了一个Book类并生成了对应的getter和setter方法。在setter方法中我们发现了this,而且还是this.而不是.this!

仔细研究setId方法,我们发现里面的几个id所对应的东西都是不一样的。

setId(int id)中的id指的是外部调用这个方法时所赋予的参数,比如新建一个Book类变量book,book.setId(1)中的1就是参数。

this.id中的id我们显然希望他是Book类中的成员变量id,=id中的id显然应该是赋予的参数,和setId(int id)为同样的东西。

故而这个this就是为了防止编译器把三个id都认为是同样的东西,特地指明了第二个this是Book类中的成员变量id。

有些同学可能会和第一个用法中的this混淆,认为this不是指向setId方法吗?这说明你混淆了类和方法之间的区别。this指向的是类而不是方法。

3.用于在构造方法中引用满足指定参数类型的构造器

这个说法可能有些复杂,因为这个主要是用在Java中的,Java中一个方法可能对应多种构造方法,如:

public class Student

public Student()

}

public Student(String name)

}

public Student(int id)

}

}

以方便我们减少方法的数量,那么如果我们修改上述代码变为:

public class Student

public Student() {

this(“HelloWorld”);

}

public Student(String name) {

}

public Student(int id) {

}

}

this又出现了,这次this出现在了构造方法之中,这意味着当你不使用参数调用Student类时,编译器会自动认为你使用了“HelloWorld”参数调用了Student类中的Student(String name)的构造方法,如果改成this(1)的话那就是Student(int id)的构造方法.

注:第三种用法,每个构造方法只能引用一个构造方法!而且必须位于起始位置。

public class Student

public Student() {

this(“HelloWorld”);

}

public Student(String name) {

this(1);

}

public Student(int id) {

}

}

这是符合规范的,无论你使用Student()还是Student(“...”),都等于Student(1);

public class Student

public Student() {

this(“HelloWorld”);

this(1);

}

public Student(String name) {

}

public Student(int id) {

}

}

这是错误的,你使用Student()时编译器会不知道到底应该使用Student(“HelloWorld”)还是Student(1)而选择死亡。

android 类型.this,Android中this的用法相关推荐

  1. android 类型.this,Android中各种类型对话框的使用

    只有标题和文本内容简单对话框 代码与范例: AlertDialog.Builder dlg; dlg = new AlertDialog.Builder(AlertDialogSample.this) ...

  2. 【Android 逆向】Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | Visual Studio 中 SDK 和 NDK 安装位置 )

    文章目录 一.Visual Studio 中安装 " 使用 C++ 的移动开发 " 开发库 二.Visual Studio 中安装的 Android SDK 和 NDK 位置 三. ...

  3. Android中Parcelable接口用法

    --  通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象.也可以将Parcel看成是一个流,通过writeToPa ...

  4. 关于android隐式启动activity的分析和说明,Android学习之Intent中显示意图和隐式意图的用法实例分析...

    本文实例讲述了Android学习之Intent中显示意图和隐式意图的用法.分享给大家供大家参考,具体如下: Intent(意图)主要是解决Android应用的各项组件之间的通讯. Intent负责对应 ...

  5. Android中Parcelable接口用法 和 Serializable实现与Parcelabel实现的区别

    1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. ...

  6. socket android用法,Android NDK中socket的用法以及注意事项分析

    与Java层中的套接字相比,本机层中的Socket可以选择更多的配置项,并获得关于当前拥塞状态的更准确的信息,那么 NDK中socket的用法以及注意事项分析,大家清楚吗?下文是爱站技术频道小编为大家 ...

  7. android折叠布局,Android中FoldingLayout折叠布局的用法及实战全攻略

    一.概述无意中翻到的FoldingLayout的介绍的博客,以及github地址.感觉很nice呀,于是花了点时间研究以及编写,本篇博客将带大家从最基本的原理分析,一步一步的实现我们的FoldingL ...

  8. Android中am命令用法详解

    Android中am命令用法 位于frameworks/base/cmds/pm am命令作用:管理Activity usage: am [start|broadcast|instrument|pro ...

  9. android 字体大小属于什么类型,聊聊 Android 中的字体大小适配

    本篇文章已授权微信公众号 guolin_blog(郭霖)独家发布 前言 虽然去年写的一篇文章[一种非常好用的Android屏幕适配]就包含字体大小适配,但那篇文章讲的是根据不同屏幕尺寸来适配字体大小的 ...

最新文章

  1. 生信服务器 | 更改 CentOS/RHEL 6/7 中的时区
  2. 7-3 逆序的三位数(C语言)
  3. Python 笔试集:什么时候 i = i + 1 并不等于 i += 1?
  4. leetcode算法题--Decode String
  5. Linux ls 命令详解
  6. JVM - 剖析Java对象头Object Header之对象大小
  7. java 中IO流的概念
  8. Python中的支持向量机SVM的使用(有实例项目给的地址)
  9. 用Syslog 记录UNIX和Windows日志的方法
  10. 触发器与约束的适用条件
  11. window 后台启动java参数启动
  12. FCKeditor 配置、扩展
  13. C#窗体控件简介ListBox
  14. 软件测试佣金问题等价类,测试用例设计白皮书--等价类划分方法
  15. 如何修复图片清晰度呢?这三款软件不要错过
  16. openresty 网关rsa+aes+redis鉴权解密
  17. 关于传递函数的频率响应和低通滤波器
  18. 数组填空题c语言及答案,C语言程序设计 程序填空题库及答案
  19. 印象笔记如何分享链接_几步搞懂印象笔记的链接功能
  20. 【0091】【创建postgres后端进程】PostgreSQL如何接收并处理客户端的socket请求(4)?

热门文章

  1. ajaxutil java,Ajax的工具类AjaxUtils,使用struts返回Json类型
  2. TreeSet学习,比较器学习
  3. 【 批量爬取下载geo.datav.aliyun.com下地图的json文 】
  4. 思维导图Vue组件 mindmap
  5. NIO与零拷贝和AIO
  6. 【2019.09.07】2019徐州网络赛
  7. [转帖]Ipvsadm参数详解(常用命令)
  8. [Project Euler] 来做欧拉项目练习题吧: 题目013
  9. 移动客户端UI设计指南
  10. eclipse如何以javadoc方式查看源码的注释