MainActivity.this和this, SomeActivity.class的解释
一、MainActivity.this和this的解读
1.Context 和 Activity 的关系
很多地方需要用的Context这个类型的参数,通过源码追溯,发现 Activity 间接继承了 Context类,因此Activity对象本身就是Context类型
2.类名.this什么时候用?
(1)内部类需要用到外部类的成员变量或方法时
备注:如果内部类中没有重名的变量n,sout语句中也可以直接使用n,不用写Demo.this.n
1 public class Demo { 2 int n = 100; 3 4 public void show(){ 5 A a = new A(); 6 a.foo(); 7 } 8 9 // 内部类 10 class A{ 11 public int n = 200; 12 void foo(){ 13 System.out.println("Demo::A::foo(): " + n); 14 15 // 内部类需要用到外部类的成员或方法 16 System.out.println("Demo.this.n : " + Demo.this.n); 17 } 18 } 19 }
3.MainActivity.this
(1)当出现内部类时,如果要指定Context类型的参数,必须使用MainActivity.this
例如,创建Intent对象时,第一个参数需要指定Context对象,一般使用当前的Activity,但由于this指向的是内部类MyClickListener,而它并不是一个Context类型,所以需要使用外部类,即MainActivity.this
1 public class MainActivity extends Activity{ 2 3 // MainActivity 的内部类MyClickListener 表示按钮监听 4 private class MyClickListener implements OnClickListener{ 5 6 @Override 7 public void onClick(View v) { 8 // 如果这里用this则表示MyClickListener的这个类的对象;该对象并不是Context的子类 9 // 因此Intent 的第一个参数必须是 该类外部类,需要明确指出 10 Intent intent = new Intent (MainActivity.this, SomeActivity.class); 11 } 12 } 13 14 }
(2)当没有内部类时,也可以直接使用this
此时的this指向的就是MainActivity的实例对象本身
1 public class MainActivity extends Activity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 8 Intent intent = new Intent (this, SomeActivity.class); 9 startActivity(intent); 10 } 11 }
========================= 华丽的分割线 ======================
2.类名.class的解释
(1)Java中一切皆对象,因此类型也是一种类,简称类型类,所有的类型类都是Class类的一个实例
(2)Java中所有的类都直接或间接地继承Object类,而Object类中有一个成员方法 getClass(),可以获得这个实例对象的类型类
(3)如果知道一个对象,可以用对象的 getClass()方法获得该对象的类型类;如果知道一个类,可以用 类名.class 获得该类的类型类
备注:Class对象的生成方法:
(1)类名.class
(2)Classs.forName("类名字符串") // 类名字符串 是 包名 + 类名
(3)实例对象.getClass()
参考文献:
https://blog.csdn.net/lggbxf/article/details/79176284
https://www.cnblogs.com/Seachal/p/5371733.html