Android笔记(一):从this关键字发散
this 的表示范围
this 指的是它所在的直接所在的类。
例如:
public class MyClass{
int num;
public MyClass(int num){
this.num = num;
}
}
在初始化中,传入的变量名与 MyClass 类的类变量名一致。如果直接:
num = num;
这样是得不到预期的效果的。
这里的 this.num 可以理解为 MyClass.num ,但又不是 MyClass.num 。因为程序在运行的时候,会有一个 MyClass 类的实例对象。这个 this 指的是实例化的对象,而 MyClass.num 则指的是静态的类。
Android 中,在给 MainActivity 类的按钮设置点击事件的时候:
btnSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"this is a toast",Toast.LENGTH_SHORT).show();
}
});
这里用到了 MainActivity.this ,如果直接传入 this 则是错的。
但同时你又会发现,如果你不是在这个new View.OnClickListener()里面写 Toast ,就不用写成MainActivity.this,而是直接写成:
Toast.makeText(this,"this is another toast",Toast.LENGTH_SHORT).show();
怎么会有两种写法?
第一种写法是因为这里的new View.OnClickListener()创建了一个对象,View.OnClickListener()是一个接口,那么自然就得有一个类来实现这个接口,这里是一个匿名类。也就是说,第一种写法是在 MainActivity 类的内部的一个类里面写的 Toast 。那么如果直接使用 this ,这时它指向的是这个匿名类,因为 this 的直接所在类是这个匿名类。
第二种写法是因为这是直接写在 MainActivity 这个类的方法里面的,这行代码没有再被一个类所包含, MainActivity 是它的直接上层类。
传入 Activity 而不是 Context ?
到这里还有一个疑问,那就是 Toast 类的这个 makeText 所要求的参数:
public static Toast makeText(Context context, CharSequence text, @Duration int duration)
这里接收的是 Context ,而我们传入的是 Activity 。
在 Activity官方文档 可以看到:

Activity 是 Context 的间接子类,所以可以直接传入 Activity 。
顺便,我们再来看看我们经常看到的一个AppCompatActivity类,也就是我们每次创建新的 Activity 的时候,Android Studio 自动帮我们继承的类。我以前曾经很好奇:为什么不是直接继承 Activity 类?

这个 AppCompatActivity 是 Activity 的间接子类!它是一种向下兼容的 Activity ,可以将在 Android 2.1系统之后 Activity 增加的内容可以在 Android 2.1上正确执行。只要你编写程序的时候,在build.gradle的dependencies里添加远程依赖库,例如:
compile 'com.android.support:appcompat-v7:25.1.0'
这个通常是 Android Studio 自动添加的,我们只需要放心的使用 AppCompatActivity 就行了。
Android笔记(一):从this关键字发散的更多相关文章
- Android笔记——Android中数据的存储方式(二)
我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效 ...
- Android笔记:触摸事件的分析与总结----TouchEvent处理机制
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320 ...
- Android 笔记之 R 文件
Android笔记之R文件 h2{ color: #4abcde; } a{ color: blue; text-decoration: none; } a:hover{ color: red; te ...
- Android 笔记之 Android 系统架构
Android笔记之Android系统架构 h2{ color: #4abcde; } a{ color: blue; text-decoration: none; } a:hover{ color: ...
- Android笔记之使用Glide加载网络图片、下载图片
Glide简介 不想说太多,真的很方便:P)可以节省我不少时间 GitHub地址:https://github.com/bumptech/glide 加载网络图片到ImageView Glide.wi ...
- Android笔记--View绘制流程源码分析(二)
Android笔记--View绘制流程源码分析二 通过上一篇View绘制流程源码分析一可以知晓整个绘制流程之前,在activity启动过程中: Window的建立(activit.attach生成), ...
- Android笔记--View绘制流程源码分析(一)
Android笔记--View绘制流程源码分析 View绘制之前框架流程分析 View绘制的分析始终是离不开Activity及其内部的Window的.在Activity的源码启动流程中,一并包含 着A ...
- Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮
原文:Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮 上面就是几张预览图!代码在最底下 主要就两个步骤,画图.监听点击 1.整个控件基本上是一步步画出来的,重写onDraw方法开始 ...
- Android(java)学习笔记83:finally关键字的作用
package cn.itcast_07; import java.text.ParseException; import java.text.SimpleDateFormat; import jav ...
随机推荐
- JNI 详细使用步骤 上手示例
1.定义本地native方法 定义本地方法,通常情况下,应单独定义一个类来封装所有native方法 /** 存放native方法的类 */ public class MyNativeMethods { ...
- ReSharper warning: Virtual member call in a constructor
1.构造函数的执行顺序是:基类--->派生类 2.如果虚方法被重写后,由于基类中调用了虚方法,此时调用的是最外层的被重写后的虚方法,此时可能会发生异常 举例: class Parent { pu ...
- css书写步骤
CSS整体书写步骤1:CSS RESET 重置2:CSS GLABAL 全局属性3: CSS分模块属性,(先写默认样式和设计图相差最大的部分,先大块布局,后细致调整) <style>/*C ...
- asp.net中应用JQuery.pagination分页
JQuery.pagination这款分页控件非常好用,可实现无刷新分页,为了方便下次做项目便于拷贝,所以在此发布一下,具体的实现流程如下: 效果图: JQuery.pagination的各个参数的说 ...
- 记一次T-SQL查询优化 索引的重要性
概述 在一次调优一个项目组件的性能问题时,发现SQL的设计真的是非常的重要,所以写一篇博文来记录总结一下. 环境介绍 这个项目组件是一个Window服务,内部在使用轮循机会在处理一个事件表中的事件,将 ...
- c-参数(argument)
In C, array arguments behave as though they are passed by reference, and scalar variables and cons ...
- iOS 8 自动布局sizeclass和autolayout的基本使用
1.首先创建新的工程,设置rootviewcontroller(这里不再多说) 2.勾选下面(因为我们到下面是使用sizeClass,所以勾选两个): 3.这里我创建了一个lable,名称为View1 ...
- SQL server概述
sqlserver中包含的对象: 数据库.事务日志.索引.文件组.数据库关系图.视图.存储过程.用户自定义函数.用户.角色.程序集.表.报表.全文目录.用户自定义数据类型 数据库实际上是最高层对象,其 ...
- Oracle数据库简介
Oracle数据库简介 一.介绍 Oracle数据库系统是美国Oracle(甲骨文)公司提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(Client/Server,C/S)或浏览 ...
- HTML5 canvas 中的线条样式
线条样式属性 lineCap 设置或返回线条的结束端点样式 butt 默认.向线条的每个末端添加平直的边缘. round 向线条的每个末端添加圆形线帽. ...