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

posted @ 2023-03-14 19:35  帅帅的飞猪  阅读(306)  评论(0编辑  收藏  举报