android 类型.this,Android中this的用法
关于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的用法相关推荐
- android 类型.this,Android中各种类型对话框的使用
只有标题和文本内容简单对话框 代码与范例: AlertDialog.Builder dlg; dlg = new AlertDialog.Builder(AlertDialogSample.this) ...
- 【Android 逆向】Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | Visual Studio 中 SDK 和 NDK 安装位置 )
文章目录 一.Visual Studio 中安装 " 使用 C++ 的移动开发 " 开发库 二.Visual Studio 中安装的 Android SDK 和 NDK 位置 三. ...
- Android中Parcelable接口用法
-- 通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象.也可以将Parcel看成是一个流,通过writeToPa ...
- 关于android隐式启动activity的分析和说明,Android学习之Intent中显示意图和隐式意图的用法实例分析...
本文实例讲述了Android学习之Intent中显示意图和隐式意图的用法.分享给大家供大家参考,具体如下: Intent(意图)主要是解决Android应用的各项组件之间的通讯. Intent负责对应 ...
- Android中Parcelable接口用法 和 Serializable实现与Parcelabel实现的区别
1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. ...
- socket android用法,Android NDK中socket的用法以及注意事项分析
与Java层中的套接字相比,本机层中的Socket可以选择更多的配置项,并获得关于当前拥塞状态的更准确的信息,那么 NDK中socket的用法以及注意事项分析,大家清楚吗?下文是爱站技术频道小编为大家 ...
- android折叠布局,Android中FoldingLayout折叠布局的用法及实战全攻略
一.概述无意中翻到的FoldingLayout的介绍的博客,以及github地址.感觉很nice呀,于是花了点时间研究以及编写,本篇博客将带大家从最基本的原理分析,一步一步的实现我们的FoldingL ...
- Android中am命令用法详解
Android中am命令用法 位于frameworks/base/cmds/pm am命令作用:管理Activity usage: am [start|broadcast|instrument|pro ...
- android 字体大小属于什么类型,聊聊 Android 中的字体大小适配
本篇文章已授权微信公众号 guolin_blog(郭霖)独家发布 前言 虽然去年写的一篇文章[一种非常好用的Android屏幕适配]就包含字体大小适配,但那篇文章讲的是根据不同屏幕尺寸来适配字体大小的 ...
最新文章
- 生信服务器 | 更改 CentOS/RHEL 6/7 中的时区
- 7-3 逆序的三位数(C语言)
- Python 笔试集:什么时候 i = i + 1 并不等于 i += 1?
- leetcode算法题--Decode String
- Linux ls 命令详解
- JVM - 剖析Java对象头Object Header之对象大小
- java 中IO流的概念
- Python中的支持向量机SVM的使用(有实例项目给的地址)
- 用Syslog 记录UNIX和Windows日志的方法
- 触发器与约束的适用条件
- window 后台启动java参数启动
- FCKeditor 配置、扩展
- C#窗体控件简介ListBox
- 软件测试佣金问题等价类,测试用例设计白皮书--等价类划分方法
- 如何修复图片清晰度呢?这三款软件不要错过
- openresty 网关rsa+aes+redis鉴权解密
- 关于传递函数的频率响应和低通滤波器
- 数组填空题c语言及答案,C语言程序设计 程序填空题库及答案
- 印象笔记如何分享链接_几步搞懂印象笔记的链接功能
- 【0091】【创建postgres后端进程】PostgreSQL如何接收并处理客户端的socket请求(4)?
热门文章
- ajaxutil java,Ajax的工具类AjaxUtils,使用struts返回Json类型
- TreeSet学习,比较器学习
- 【 批量爬取下载geo.datav.aliyun.com下地图的json文 】
- 思维导图Vue组件 mindmap
- NIO与零拷贝和AIO
- 【2019.09.07】2019徐州网络赛
- [转帖]Ipvsadm参数详解(常用命令)
- [Project Euler] 来做欧拉项目练习题吧: 题目013
- 移动客户端UI设计指南
- eclipse如何以javadoc方式查看源码的注释