MainActivity.this 和this

刚接触Android,有新鲜感,也有很多困惑,MainActivity.this就是一个典型。


1. Context和Activity的关系

在很多地方需要用到Context这个类作为参数,我们一个是用 SomeActivity.this传递。

MainActivity.this 为什么就可以代表Context了呢?

去谷歌官网,搜索Context发现,Activity是Context的间接子类,Context是Activity的间接基类。

那么根据语法,Activity就是一个Context。



2类名.this 这种语法在什么情况下会出现呢?

一句话:内部类需要用到外部类的成员变量或方法

附加说明:如果重名则必须“类名.this”指定那个类的成员变量或方法,如果没有重名则该变量可以指定所属类也可以不指定所属类。

举个例子:

[java]  view plain  copy
  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. }     

上面代码中,类A是一个内部类,它想调用外面的n,这里由于n变量在内部类A中 和外部类Demo中重名,所以必须用Demo.this.n来区分调用的是哪一个变量n。


3. 再看MainActivity.this


给一段我们经常用到的代码片段 (其他代码略)

[java]  view plain  copy
  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.             <span style="white-space:pre">        </span>startActivity(intent);  
  12.         }   
  13.     }  
  14.   
  15. }  
[java]  view plain  copy
  1.   
[java]  view plain  copy
  1. Intent intent = new Intent (MainActivity.this, SomeActivity.class);          

创建Intent对象时,传入第一个参数是个Context,一般我们用当前的Activity。

由于每一个类都有一个成员变量,名叫this。 有重名冲突,此时,在MyClickListener类中写下这行代码,那么 this代表的是当前的内部类,即MyClickListener

OnClickListener类并不是Context的子类,直接用this会报错。因此这里必须显示指定外部类的那个this,用MainActivity.this指明。



假如,把这行代码换个位置,放到MainActivity的onCreate()中去,(在创建的时候,转到其他Activity,看似没什么意义,为了理解有帮助)

[java]  view plain  copy
  1. Intent intent = new Intent (MainActivity.this, SomeActivity.class);    

移到onCreate中:


[java]  view plain  copy
  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. }  

这代码片段:

[java]  view plain  copy
  1. Intent intent = new Intent (this, SomeActivity.class);   

看!这里可以直接用this,知道原因吧。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值