Android中非静态getSharedPreferences无需实例化即可调用的疑问
Android Context方法调用原理解答
核心结论
你观察到的现象并没有违反Java基础规则,本质是Android框架封装和隐含关键字带来的调用错觉,具体原因如下:
- 你书写这段代码的位置,通常是在
Activity、Service等Android系统组件内部,这类组件的继承链本身就包含ContextWrapper:以Activity为例,继承关系为Activity → ContextThemeWrapper → ContextWrapper → Context,也就是说你写代码所在的类本身就是ContextWrapper的子类 - 当你在类内部直接调用父类的非静态方法时,Java会自动隐含
this前缀指向当前类的实例,你写的getSharedPreferences()完整写法是this.getSharedPreferences("i", Context.MODE_PRIVATE),本质还是通过实例调用非静态方法 - 这类系统组件的实例化不需要开发者手动执行,Android框架会在组件启动流程中自动完成实例创建、上下文绑定等操作,不需要你手动
new ContextWrapper()创建对象
代码修正
你记忆中的调用方法参数存在错误,正确的写法如下:
// 第二个参数为SharedPreferences访问模式,常用MODE_PRIVATE表示仅当前应用可读写该配置文件 SharedPreferences shared = getSharedPreferences("i", Context.MODE_PRIVATE);
内容的提问来源于stack exchange,提问作者JINWON KIM
相关产品推荐
相关产品推荐

