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)而选择死亡。

时间: 2024-12-11 02:00:37

Android中this的用法的相关文章

关于Android 中 raw的用法以及与assets 的的区别和共同点

一.raw与assets的区别及共同点 (1) res/raw和assets的相同点 两个目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. (2) res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.raw.filename: assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类. 2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是a

Android中的ContentValues用法

ContentValues 和HashTable类似都是一种存储的机制 但是两者最大的区别就在于,contenvalues只能存储基本类型的数据,像string,int之类的,不能存储对象这种东西,而HashTable却可以存储对象.ContentValues存储对象的时候,以(key,value)的形式来存储数据. 在忘数据库中插入数据的时候,首先应该有一个ContentValues的对象所以: ContentValues initial = new ContentValues(); init

Android中Toast的用法简介

转自:http://www.cnblogs.com/GnagWang/archive/2010/11/26/1888762.html Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,而且Toast显示的时间有限,过一定的时间就会自动消失.下面用一个实例来看看如何使用Toast. 1.默认效果 代码 Toast.makeText(getApplicationContext(), "默认Toast样式",     Toast.LEN

Android中pm命令用法(转)

usage: pm [list|path|install|uninstall] pm list packages [-f] pm list permission-groups pm list permissions [-g] [-f] [-d] [-u] [GROUP] pm list instrumentation [-f] [TARGET-PACKAGE] pm path PACKAGE pm install [-l] [-r] PATH pm uninstall [-k] PACKAGE

Android 中 LayoutParams 的用法

一个控件应当使用它的父控件的 LayoutParams 类型.因此,一个 TableVow 应该使用 TableLayout.Params . 所以,以一个 TableRow 为例: TableRow tableRow = new TableRow(context); tableRow.setLayoutParams(new TableLayout.LayoutParams( TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutPar

Android中Application类用法

原文:http://www.cnblogs.com/renqingping/archive/2012/10/24/Application.html Application类 Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,用来存储系统的一些信息. Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,所以Application可以说是单例(si

android中sharedPreferences的用法

SharedPreferences介绍: 做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等耗时大大影响了程序的效率,因此我们使用键值这种一一对应的关系来存放这些配置信息.SharedPreferences正是Android中用于实现这中存储方式的技术. SharedPreferences的使用非常简单,能够轻松的存放数据和读取数据.SharedPreferences只能保存简单类型的数据,例

Android中Parcelable接口用法(转自Harvey Ren)

1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing the Parcelable.Creator int

android 中vector的用法 ,坑 ,怎么替代,关于这几方面的一些看法

在安卓的发展历程中,由于设备碎片化的原故,谷歌在app中图标的适配上做出一步又一步的改进,大体有这么几个阶段: 首先有了drawable-(m|h|xh|xxh|xxxh)dpi 自android studio后,又有了mipmap-(m|h|xh|xxh|xxxh)dpi 随着android L的发布,带来了VectorDrawable,矢量图的支持 第一种方案大家都很熟悉, 但也是我们头痛的地方,因为每种icon都需要出几套不同分辨率,这无形的增加了app的容量,而且也增加了美工和开发人员的