zoukankan      html  css  js  c++  java
  • Android笔记(一):this 的表示范围和 Context

    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 就行了。

  • 相关阅读:
    倒排索引在MYSQL,PostgreSQL,ElasticSearch中的设计思想
    MySQL Group Replication: What Is It? Replicated Database State Machine & Paxos implementation
    Redis 6.0 docker Cluster
    What is the "Docker Subnet" used for?
    Windows MYSQL 8.0 或者 5.7 查找my.ini 修改端口号
    Kerberos Network Authentication Service Window & Mac
    协合新能源集团有限公司 | 红海 eHR BPMN
    基于 springBoot 实现webSocket方式的扫码登录
    Python中IO编程-StringIO和BytesIO
    Neo4j基本入门
  • 原文地址:https://www.cnblogs.com/schaepher/p/6265386.html
Copyright © 2011-2022 走看看