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.gradledependencies里添加远程依赖库,例如:

compile 'com.android.support:appcompat-v7:25.1.0'

这个通常是 Android Studio 自动添加的,我们只需要放心的使用 AppCompatActivity 就行了。

Android笔记(一):this 的表示范围和 Context的更多相关文章

  1. Android笔记——Android中数据的存储方式(二)

    我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效 ...

  2. Android笔记:触摸事件的分析与总结----TouchEvent处理机制

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320   ...

  3. Android 笔记之 R 文件

    Android笔记之R文件 h2{ color: #4abcde; } a{ color: blue; text-decoration: none; } a:hover{ color: red; te ...

  4. Android 笔记之 Android 系统架构

    Android笔记之Android系统架构 h2{ color: #4abcde; } a{ color: blue; text-decoration: none; } a:hover{ color: ...

  5. Android笔记之使用Glide加载网络图片、下载图片

    Glide简介 不想说太多,真的很方便:P)可以节省我不少时间 GitHub地址:https://github.com/bumptech/glide 加载网络图片到ImageView Glide.wi ...

  6. Android笔记--View绘制流程源码分析(二)

    Android笔记--View绘制流程源码分析二 通过上一篇View绘制流程源码分析一可以知晓整个绘制流程之前,在activity启动过程中: Window的建立(activit.attach生成), ...

  7. Android笔记--View绘制流程源码分析(一)

    Android笔记--View绘制流程源码分析 View绘制之前框架流程分析 View绘制的分析始终是离不开Activity及其内部的Window的.在Activity的源码启动流程中,一并包含 着A ...

  8. Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮

    原文:Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮 上面就是几张预览图!代码在最底下 主要就两个步骤,画图.监听点击 1.整个控件基本上是一步步画出来的,重写onDraw方法开始 ...

  9. 我的Android笔记--我对安卓系统的一些了解

    敲了这么长时间代码,记录一下我对Android的一些概念,下面大部分内容来源自网络资料和官方给的文档.     1,Android操作系统的核心属于Linux的一个分支,具有典型的Linux调度和功能 ...

  10. Android笔记——Android中数据的存储方式(三)

    Android系统集成了一个轻量级的数据库:SQLite,所以Android对数据库的支持很好,每个应用都可以方便的使用它.SQLite作为一个嵌入式的数据库引擎,专门适用于资源有限的设备上适量数据存 ...

随机推荐

  1. js 正则学习小记之匹配字符串字面量

    今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高亮练手,所以用js代码当作例子) va ...

  2. Asp.net操作Word文档,原来这么简单啊!

    引用Word对象库文件  具体做法是打开菜单栏中的项目>添加引用>浏览,在打开的“选择组件”对话框中找到MSWORD.OLB后按确定即可引入此对象库文件,vs.net将会自动将库文件转化为 ...

  3. 【LibreOJ】#6354. 「CodePlus 2018 4 月赛」最短路 异或优化建图+Dijkstra

    [题目]#6354. 「CodePlus 2018 4 月赛」最短路 [题意]给定n个点,m条带权有向边,任意两个点i和j还可以花费(i xor j)*C到达(C是给定的常数),求A到B的最短距离.\ ...

  4. 关于gb2312编码和utf8码的一个问题

    ANSI(注意拼写不是ASCII)并不是“一种”编码,而是“多种”编码的统称.在简体中文Windows上,ANSI指GBK编码:在繁体中文Windows上,ANSI指Big5编码:在英文Windows ...

  5. Wordpress页脚

    <?php /** * The template for displaying the footer */ ?> <?php if ( apply_filters( 'show_fl ...

  6. oracel回收站清理

    从powerdesigner中往oracle中导入表,出现了很多类似“BIN$Z35FPY7eFZDgUKjAC94NkA==$0 ”这样的表名, 原因是删除表的时候没有彻底的删除表,而是把表放入回收 ...

  7. imperva—waf 敏感字段显现

    imperva WAF中看到的日志内容信息有些都是敏感的  比如登录登出的信息 如何调整敏感信息的现实方式,并可以自定义敏感字段? 这里添加字段就可以了 这样就将******转变为明文了

  8. 使用crontab命令添加计划任务

    Ubuntu 16.04, 计划任务 就是 有(时间)计划地执行(做)任务,有计划 包括 定时执行(在哪些时间点执行任务).按照周期执行(每隔多少时间执行任务). 那么,什么是任务呢?就是 自己想要干 ...

  9. MySQL 5.6表空间传输

    在MySQL 5.6 Oracle引入了一个可移动表空间的特征(复制的表空间到另一个服务器)和Percona Server采用部分备份,这意味着你现在可以备份单个数据库或表:由于Percona Ser ...

  10. 有没有 linux 命令可以获取我的公网 ip, 类似 ip138.com 上获取的 ip?

    curl ipinfo.iocurl ifconfig.me 阿里云 :139.129.242.131赤峰:   219.159.38.197开平:   221.194.113.146定州:  121 ...