Android中This、super、getApplicationContext()、getApplication()之间的区别

"this",作为一个特殊的关键字,它的规则如下: 
1。可以表示构造函数传递。this(a,b)表示调用另外一个构造函数。这里面的this就是一个特殊语法,不是变量,没有什么类型。 
2。可以在一个类的非static成员内部使用,表示当前这个对象。此时,this就是一个final的普通变量,它有静态类型,就是这个类C本身;它有动态类型,就是当前这个对象的类型。你可以对它调用成员函数,把它传递给别的函数,等等等等。只要一个C类型的final变量可以出现的地方,它就可以出现。

"super"。它和"this"类似,但是也有不同的地方。 
1。表示调用父类的构造函数。也是一个特殊语法,不是变量,没有什么类型。

2。可以在一个类的非static成员内部使用。比如super.method()。 
但是,注意,这个super.method()只是长得跟some_var.method()一样,一个语法糖而已。实质上,"super"根本不是一个变量。

为什么不是?因为如果是就坏了。java里面有一个金科玉律:任何public非static函数的调用都是多态的。 
所以,如果super是个变量,也指向当前对象,那么,不管super的静态类型是什么super.method()必然调用的是子类的那个版本,而不会是我们期望的,静态地选择父类的那个版本。

所以,你只要把super.xxx看成一个特殊的语法,比如理解为“super:xxx”就好了。

既然super不是一个变量,那么不能把它象一个普通变量那样"==",或者传递给某个函数就看起来很正常了,是么?何况,你其实也用不着它,有this你这些要求就都可以办到了。

3。super的另外一个作用是调用父类的protected函数。只有通过"super"这个魔咒,我们才能操作父类的protected成员,别无它法。
4,Android 中this、 getApplicationContext()、getApplication()之间的区别

this:代表当前,在Activity当中就是代表当前的Activity,换句话说就是Activity.this在Activity当中可以缩写为this.

getApplicationContext():生命周期是整个应用,应用摧毁,它才摧毁。

getApplication():andorid 开发中共享全局数据;

 我们在平时的开发中,有时候可能会需要一些全局数据,来让应用中得所有Activity和View都能访问到,大家在遇到这种情况时,可能首先会想到自己定义一个类,然后创建很多静态成员,不过andorid已经为我们提供了这种情况的解决方案:在Android中,有一个名为Application的类,我们可以在Activity中使用getApplication(),方法来获得,它是代表我们的应用程序的类,使用它可以获得当前应用的主题,资源文件中的内容等,这个类更灵活的一个特性就是可以被我们继承,来添加我们自己的全局属性。

getApplicationContext()、getbasecontext()与this的区别,getbasecontext


getApplicationContext() 返回应用的上下文,生命周期是整个应用,应用摧毁它才摧毁

Activity.this的context 返回当前activity的上下文,属于activity ,activity 摧毁他就摧毁

getbasecontext()返回由构造函数指定或setBaseContext()设置的上下文


解getApplicationContext()与Activitythis不同

getApplicationContext() 返回应用的上下文,生命周期是整个应用,应用摧毁它才摧毁 Activity.this的context 返回当前activity的上下文,属于activity ,activity 摧毁他就摧毁 getBaseContext() 返回由构造函数指定或setBaseContext()设置的上下文  

android中thisgetContext()与getApplicationContext()的不同?

this.getContext()拿到的是当前Activity的Context,而getApplicationContext()拿到的是Application的Context。

In various bits of Android code I've seen: 
在大量的android代码中,我看到如下的写法:
public class MyActivity extends Activity { 
    public void method() { 
       mContext = this;    // since Activity extends Context 
       mContext = getApplicationContext(); 
       mContext = getBaseContext(); 
    } 
}
长期持有activity.this(也就是activity的context)会导致activity无法及时回收,有内存泄露的风险,建议用getApplicationContext()代替.
This blog post on the official Google Android developers blog was written mostly to help address memory leaks, but provides some good information about contexts as well:
这个谷歌官方的Android开发者写,主要是为了帮助解决内存泄漏,的博客文章,同时也给contexts提供了一些良好的信息:

In a regular Android application, you usually have two kinds of Context, Activity and Application.
在一个普通的Android应用程序中,你通常有两种Context,Activity和Application。

Reading the article a little bit further tells about the difference between to the two and why you might want to consider using the application Context (Activity.getApplicaitonContext()) rather than using the Activity context ("this"). Basically the Application context is associated with the Applicaiton and will always be the same throughout the life cycle of you app, where as the Activity context is associated with the activity and could possible be destroyed many times as the activity is destroyed during screen orientation changes and such.
如果再深入读下这篇文章,它告诉了我们这两种Context的不同,并且为什么你会考虑使用应用程序Context(Activity.getApplicaitonContext())而不是使用活动Context(即"this")。基本上来说呢,应用程序Context是和应用程序关联的,并且在程序的生命周期内,总是一样的。但是,活动Context是关联在某个活动上的,随着Activity的销毁(比如横竖屏切换等情况),这个Context也会被销毁N多次。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值