什么是Android上的“Context”?

在Android编程中,Context类到底是什么,它的用途是什么?

我在开发者网站上读到它,但我无法清楚地理解它。

790088 次浏览

简单地说:

顾名思义,它是应用程序/对象当前状态的上下文。它让新创建的对象了解发生了什么。通常你调用它来获取有关程序另一部分(活动和包/应用程序)的信息。

您可以通过调用getApplicationContext()getContext()getBaseContext()this来获取上下文(当在从Context扩展的类中时,例如Application、Activity、Service和IntentService类)。

上下文的典型用法:

  • 创建新对象:创建新视图、适配器、侦听器:

     TextView tv = new TextView(getContext());ListAdapter adapter = new SimpleCursorAdapter(getApplicationContext(), ...);
  • 访问标准公共资源:LAYOUT_INFLATER_SERVICE、共享偏好等服务:

     context.getSystemService(LAYOUT_INFLATER_SERVICE)getApplicationContext().getSharedPreferences(*name*, *mode*);
  • 隐式访问组件:关于内容提供商,广播,意图

     getApplicationContext().getContentResolver().query(uri, ...);

Context是系统的句柄;它提供解析资源、获取对数据库和首选项的访问权限等服务。Android应用程序有活动。Context就像应用程序当前运行的环境的句柄。活动对象继承Context对象。

有关更多信息,请查看Android Studio Android开发简介-教程

Android背景是一个接口(一般意义上,不是Java意义上的;Java,Context实际上是一个抽象类!),它允许访问应用程序特定的资源和类以及有关应用程序环境的信息。

如果您的Android应用程序是一个Web应用程序,您的上下文将类似于ServletContext(我在这里没有进行确切的比较)。

您的活动和服务还扩展了Context,因此它们继承了所有这些方法来访问运行应用程序的环境信息。

上下文是对当前对象的引用,如this。上下文还允许访问有关应用程序环境的信息。

Context基本上用于资源访问并获取应用程序(用于应用程序上下文)或活动(用于活动上下文)或任何其他…

为了避免内存泄漏,您应该为每个需要上下文对象的组件使用应用程序上下文。

Context到底是什么?

根据Android参考留档,它是一个表示各种环境数据的实体。它提供对本地文件、数据库、与环境关联的类加载器、服务(包括系统级服务)等的访问。在本书中以及在您使用Android的日常编码中,您将看到Context经常传递。

摘自“实践中的Android”一书,第60页。

一些Android API需要Context作为参数

如果你浏览各种Android API,你会发现请注意,它们中的许多都将android.content.Context对象作为参数。您还会看到活动或服务通常用作Context。这之所以有效,是因为这两个类都从Context扩展而来。

可以将其视为已隔离运行应用程序或服务的进程的VM。孤立的环境可以访问一堆底层系统信息和某些允许的资源。你需要该上下文来获取这些服务。

android.content.Context提供与Android系统和项目资源的连接。它是有关应用程序环境的全局信息的接口。

Context还提供对Android服务的访问,例如位置服务。

活动和服务扩展了Context类。

Context是关于应用程序环境的全局信息的“接口”。在实践中,Context实际上是抽象类,其实现由Android系统提供。

它允许访问特定于应用程序的资源和类,以及应用程序级操作的向上调用,例如启动活动、广播和接收意图等。

在下图中,您可以看到类的层次结构,其中Context是该层次结构的根类。特别值得强调的是,ActivityContext的后代。

活动图

源代码


Context in Android这个话题对很多人来说似乎都很困惑。人们只知道在Android中做一些基本的事情经常需要Context。人们有时会感到恐慌,因为他们试图执行一些需要Context的操作,他们不知道如何“获取”正确的Context。我将尝试揭开Context in Android的神秘面纱。对这个问题的全面处理超出了这篇文章的范围,但我会尝试给出一个大致的概述,这样你就可以了解Context是什么以及如何使用它。要理解Context是什么,让我们看一下源代码:

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/content/Context.java

什么是Context?

留档本身提供了一个相当简单的解释:Context类是“关于应用程序环境的全局信息的接口”。

Context类本身被声明为一个抽象类,其实现由Android操作系统提供。留档进一步规定Context“…允许访问特定于应用程序的资源和类,以及向上调用应用程序级操作,例如启动活动、广播和接收意图等”。

现在您可以很好地理解为什么名称为Context。这是因为它就是这样。Context为活动、服务或任何其他组件提供链接或钩子,从而将其链接到系统,从而能够访问全局应用程序环境。换句话说:Context提供了组件问题的答案“我在哪里一般与应用程序相关,我如何访问/与应用程序的其余部分进行通信?”如果这一切看起来有点混乱,快速查看Context类公开的方法提供了一些关于其真实性质的进一步线索。

以下是这些方法的随机抽样:

  1. getAssets()
  2. getResources()
  3. getPackageManager()
  4. getString()
  5. getSharedPrefsFile()

所有这些方法有什么共同点?它们都使有权访问Context的人能够访问应用程序范围的资源。

换句话说,Context将具有对它的引用的组件挂钩到应用程序环境的其余部分。例如,资产(想想项目中的“/资产”文件夹)在应用程序中可用,前提是活动、服务或任何知道如何访问这些资源的东西。getResources()也是如此,它允许我们做像getResources().getColor()这样的事情,它会将您连接到colors.xml资源(不要介意aapt允许通过java代码访问资源,这是一个单独的问题)。

结果是Context允许访问系统资源,并将组件挂钩到“更大的应用程序”中。让我们看一下Context的子类,这些类提供抽象Context类的实现。最明显的类是Activity类。Activity继承自ContextThemeWrapper,它继承自ContextWrapper,它继承自Context本身。这些类对于在更深层次上理解事物很有用,但就目前而言,知道ContextThemeWrapperContextWrapper几乎就是它们听起来的样子就足够了。它们通过“包装”上下文(实际上下文)并将这些函数委托给该上下文来实现Context类本身的抽象元素。一个例子很有帮助-在ContextWrapper类中,Context类中的抽象方法getAssets如下实现:

@Overridepublic AssetManager getAssets() {return mBase.getAssets();}

mBase只是构造函数针对特定上下文的字段集。因此,一个上下文被包装,ContextWrapper将其getAsset方法的实现委托给该上下文。让我们回到检查最终从Context继承的Activity类,看看这一切是如何工作的。

你可能知道活动是什么,但是回顾一下-它基本上是“用户可以做的一件事。它负责提供一个窗口来放置用户与之交互的UI”。熟悉其他API的开发人员,甚至非开发人员可能会将其通俗地视为“屏幕”。这在技术上是不准确的,但它对我们的目的并不重要。那么ActivityContext如何交互以及它们的继承关系到底发生了什么?

再一次,看具体的例子很有帮助。我们都知道如何启动活动。如果你有启动活动的“上下文”,你只需调用startActivity(intent),其中意图描述了你启动活动的上下文和你想启动的活动。这是熟悉的startActivity(this, SomeOtherActivity.class)

this是什么?this是你的活动,因为Activity类继承自Context。完整的独家新闻如下:当你调用startActivity时,Activity类最终执行如下内容:

Instrumentation.ActivityResult ar =mInstrumentation.execStartActivity(this, mMainThread.getApplicationThread(), mToken, this,intent, requestCode);

因此,它利用了Instrumentation类中的execStartActivity(实际上来自Instrumentation中称为ActivityResult的内部类)。

在这一点上,我们开始窥视系统内部。

这是操作系统实际处理一切的地方。那么仪器如何准确地启动活动呢?好吧,上面execStartActivity方法中的参数this是你的活动,即上下文,execStartActivity利用了这个上下文。

一个30,000的概述是这样的:Instrumption类跟踪它正在监视以完成其工作的活动列表。此列表用于协调所有活动并确保在管理活动流时一切顺利运行。

有一些操作我还没有完全研究哪些协调线程和进程问题。最终,ActivityResult使用了一个本机操作-ActivityManagerNative.getDefault().startActivity(),它使用了你调用startActivity时传入的Context。你传入的上下文用于在需要时帮助“意图解析”。意图解析是系统可以确定意图目标(如果没有提供)的过程。(有关更多详细信息,请查看此处的指南)。

为了让Android做到这一点,它需要访问Context提供的信息。具体来说,系统需要访问ContentResolver,以便它可以“确定意图数据的MIME类型”。关于startActivity如何使用上下文的整个部分有点复杂,我自己也不完全理解内部结构。我的主要观点只是说明为了执行对应用程序至关重要的许多操作,需要如何访问应用程序范围的资源。Context提供对这些资源的访问。一个更简单的例子可能是视图。我们都知道你通过扩展RelativeLayout或其他View类创建了一个自定义视图,你必须提供一个接受Context作为参数的构造函数。当你实例化你的自定义视图时,你会在上下文中传递。为什么?因为View需要能够访问主题、资源和其他View配置详细信息。视图配置实际上是一个很好的例子。每个Context都有各种参数(Context实现中的字段),这些参数由操作系统本身设置,用于显示的尺寸或密度等。很容易看出为什么这些信息对设置视图等很重要。

最后一句话:出于某种原因,刚接触Android的人(甚至不那么新的人)在涉及Android时似乎完全忘记了面向对象编程。出于某种原因,人们试图将他们的Android开发弯曲到预先设想的范式或学习行为。

Android有自己的范式和某种模式,如果放弃你先入为主的观念,简单地阅读留档和开发指南,这种模式实际上是相当一致的。然而,我的真正观点是,虽然“获得正确的上下文”有时可能很棘手,人们不合理地恐慌,因为他们遇到了需要上下文的情况,但认为他们没有上下文。再次强调,Java是一种具有继承设计的面向对象语言。

你只有“拥有”活动内部的上下文,因为你的活动本身继承自Context。它没有魔法(除了操作系统本身设置各种参数和正确“配置”你的上下文的所有东西)。所以,把内存/性能问题放在一边(例如,在不需要的时候保留对上下文的引用,或者以对内存有负面影响的方式这样做,等等),Context是一个像其他任何对象一样的对象,它可以像任何POJO(普通旧Java对象)一样传递。有时你可能需要做一些聪明的事情来检索该上下文,但是任何从Object本身扩展而来的常规Java类都可以以一种可以访问上下文的方式编写;只需公开一个公共方法,该方法获取上下文,然后根据需要在该类中使用它。这并不是为了详尽地处理Context或Android内部,但我希望它有助于揭开Context的神秘面纱。

只是把它放在那里给新手;

首先了解Word Context:

在English lib中,它的意思是:

"构成事件、陈述或事件设置的环境”””的想法,并在其中它可以被充分理解和评估。

"书写或说出的东西的前面和前面的部分“跟随一个单词或段落并阐明其含义。

现在对编程世界有同样的理解:

应用程序/对象当前状态的上下文。它让新创建的对象了解发生了什么。通常,您调用它来获取有关程序另一部分(活动、包/应用程序)的信息

您可以通过调用getApplicationContext()getContext(), getBaseContext()this(在活动类中时)来获取上下文。

要在应用程序中获取Context Anywhere,请使用以下代码:

在您的Android应用程序中创建新类AppContext

public class AppContext extends Application {
private static Context context;
public void onCreate(){super.onCreate();AppContext.context = getApplicationContext();}
public static Context getAppContext() {return AppContext.context;}}

现在,每当您希望在非活动类中使用应用程序上下文时,调用此方法,您就拥有了应用程序上下文。

希望有帮助;)

上下文的定义

  • Context表示环境数据
  • 它提供对数据库等事物的访问

更简单的术语(示例1)

  • 考虑一下Person-X是一家初创软件公司的首席执行官。

  • 公司里有一个首席架构师,这个首席架构师负责公司所有涉及的工作,如数据库、UI等等

  • 现在CEO雇佣了一个新的开发人员。

  • 是建筑师告诉新雇佣的人的责任人的技能的基础上,新的人,他是否会处理数据库或UI等。

更简单的术语(示例2)

  • 这就像访问应用程序资源的android活动。

  • 这就像你参观酒店时,你想要早餐,午餐和午餐。#36825;在合适的时间,对吧?

  • 在逗留期间还有很多你喜欢的东西。你如何获得这些东西?

  • 你让客房服务人员把这些东西带给你。

  • 在这里,客房服务人员是上下文,考虑到您是单一活动和酒店是您的应用程序,最后是早餐,午餐和午餐晚餐必须是资源。


涉及上下文的事情是:

  1. 加载资源。
  2. 启动一项新活动。
  3. 创建视图。
  4. 获得系统服务。

上下文是活动服务申请方式等的基类

另一种描述方式:将上下文视为电视的远程和电视中的频道是资源,服务,使用意图等 - - - 这里远程充当访问以访问前台的所有不同资源。

  • 因此,Remote可以访问资源、服务、使用意图等渠道……

  • 同样,谁有权访问远程,谁就自然有权访问所有的东西,如资源、服务、使用意图等


您可以获取上下文的不同方法

  • getApplicationContext()
  • getContext()
  • getBaseContext()
  • this(在活动类时)

示例:

TextView tv = new TextView(this);

关键字this指的是当前活动的上下文。

AContext就是我们大多数人所说的申请方式。它是由Android系统制作的,只能做应用程序能够做的事情。在Tomcat中,Context也是我所说的应用程序。

有一个上下文包含许多活动,每个活动可能有许多视图。

显然,有些人会说它不适合,因为这个或那个,他们可能是对的,但是说Context是你当前的应用程序将帮助你理解你在方法参数中放了什么。

Context是应用程序/对象当前状态的上下文,是表示各种环境数据的实体。Context有助于当前活动与外部android环境交互,如本地文件、数据库、与环境关联的类加载器、服务(包括系统级服务)等。

Context是系统的句柄。它提供解析资源、获取对数据库和首选项的访问权限等服务。Android应用程序有活动。它就像应用程序当前运行的环境的句柄。活动对象继承Context对象。

可以获取上下文的不同调用方法1. getApplication ationContext(),//获取应用上下文2. getContext(),3. getBaseContext()4.或者这个(在活动类时)。

Context类android.content.实例提供与执行应用程序的Android系统的连接。例如,您可以通过Context检查当前设备显示的大小。

它还提供对项目资源的访问。它是有关应用程序环境的全局信息的接口。

Context类还提供对Android服务的访问,例如触发基于时间的事件的警报管理器。

活动和服务扩展了Context类。因此,它们可以直接用于访问Context。

Context是类的实例android.content.Context提供与执行应用程序的Android系统的连接。例如,您可以通过Context检查当前设备显示的大小。

它还提供对项目资源的访问。它是有关应用程序环境的全局信息的接口。

Context类还提供对Android服务的访问,例如触发基于时间的事件的警报管理器。

活动和服务扩展了Context类。因此,它们可以直接用于访问Context。

背景是有关应用程序环境的全局信息的接口。它是一个抽象类,其实现由Android系统提供。

Context允许访问特定于应用程序的资源和类,以及调用应用程序级操作,例如#1

这是一个例子

 public class MyActivity extends Activity {
public void Testing() {
Context actContext = this; /*returns the Activity Context since   Activity extends Context.*/
Context appContext = getApplicationContext();    /*returns the context of the single, global Application object of the current process. */
Button BtnShowAct1 = (Button) findViewById(R.id.btnGoToAct1);Context BtnContext = BtnShowAct1.getContext();   /*returns the context of the View. */

欲了解更多详情,请访问http://developer.android.com/reference/android/content/Context.html

了解android中context的简单示例:

每个老板都有一个助手来照顾,做所有不那么重要和耗时的工作。如果需要一份文件或一杯咖啡,助手就会跑来跑去。有些老板几乎不知道办公室里发生了什么,所以他们也会问他们的助手。他们自己做一些工作,但对于其他大多数事情,他们需要助手的帮助。

在这种情况下,

老板-是Android应用程序

助理-是一个上下文

文件/一杯咖啡资源

当我们需要获取有关应用程序不同部分的信息(如活动、应用程序等)时,我们通常会调用上下文。

一些涉及Context的操作(需要助手的事情):

  • 加载公共资源
  • 创建动态视图
  • 显示Toast消息
  • 启动活动等。

获取上下文的不同方法:

getContext()
getBaseContext()
getApplicationContext()
this

如果您想将背景与Android中其他熟悉的类连接起来,请记住以下结构:

Context

Context

Context上下文文件活动列表

Context

Context

所以,所有这些类都以自己的方式是上下文。如果你愿意,你可以将服务活动列表转换为背景。但是如果你仔细观察,一些类也继承了主题。在活动或片段中,你希望主题化应用于你的视图,但不关心它服务类,例如。

我解释了上下文中的差异这里

Context是每个app-s的Android特定apiSandbox提供访问应用程序私有数据,如资源,数据库,私有文件目录,首选项,设置…

大多数私有数据对于一个应用程序的所有活动/服务/广播听众都是相同的。

由于Application、Activity、Service实现了Context接口,它们可以在api调用需要Context参数的地方使用

简单地说,AndroidContext是一团糟,你不会喜欢,直到你停止担心。

AndroidContext是:

  • 神物。

  • 当你开始为Android开发时,你想传递所有应用程序的东西,但当你更接近编程、测试和Android本身时,你会避免这样做。

    • 依赖性不明确。

    • 内存泄漏的常见来源。

    • 用于测试的PITA。

  • Android系统用于调度权限、资源、偏好设置、服务、广播、样式、显示对话框和膨胀布局的实际上下文。对于一些单独的东西,你需要不同的Context实例(显然,你不能从应用程序或服务上下文显示对话框;从应用程序和活动上下文膨胀的布局可能不同)。

Context表示当前。Context用于对当前屏幕进行操作。ex.
1、获取应用上下文
2. getContext()

Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_SHORT).show();
  • Context表示获取环境数据的句柄。
  • Context类本身被声明为抽象的,其实现由android OS提供。
  • Context就像电视的遥控器,电视中的频道是资源、服务等。输入图片描述

你能用它做什么?

  • 加载资源。
  • 启动一项新活动。
  • 创建视图。
  • 获取系统服务。

获取上下文的方法:

  • getApplicationContext()
  • getContext()
  • getBaseContext()输入图片描述输入图片描述

此属性声明此布局与默认关联的活动。

老板助理类比

在深入探讨上下文的技术性之前,让我们先做一个小类比

每个老板都有一个助手或做得少的人(跑腿的)对他来说更重要和更耗时的事情。例如,如果他们需要一份文件或咖啡,然后助手就会逃跑。老板不会知道后台发生了什么,但文件或任务会发送

在这里
Boss-Android应用程序
助手-上下文
文件或一杯咖啡-资源

什么官方Android开发者网站说关于背景

上下文是您的接入点用于应用程序相关资源

让我们看看一些这样的资源或任务

  • 发起一项活动。

  • 获取文件系统上特定于应用程序的缓存目录的绝对路径。

  • 确定给定的权限是否允许特定进程和用户ID在系统中运行。

  • 检查您是否已被授予特定权限。

等等。
因此,如果一个Android应用程序想要启动一个活动,它会直接进入Context(接入点),Context类会将资源(在这种情况下是Intent)返回给他。

像任何其他类Context类一样,有字段和方法。
您可以在官方留档中探索更多关于Context的内容,它几乎涵盖了所有内容,可用方法,字段,甚至如何将字段与方法一起使用。

Context表示不同时间段的组件(或应用程序)。如果我确实在下午1点到2点之间吃了这么多食物,那么我该时间的上下文将用于访问我在该时间使用的所有方法(或资源)。内容是特定时间的组件(应用程序)。应用程序组件的Context会根据组件或应用程序的底层生命周期不断变化。例如,在Activity的onCreate()中,

getBaseContext()--给出活动构造函数设置(创建)的Activity中的contextgetApplicationContext()--在创建应用程序时给出Context设置(创建)。

注意:<application>包含所有Android组件。

<application><activity> .. </activity>
<service>  .. </service>
<receiver> .. </receiver>
<provider> .. </provider></application>

这意味着,当您从任何组件中调用getApplicationContext()时,您正在调用整个应用程序的公共上下文。

系统根据组件的生命周期不断修改Context

上下文意味着Android知道我应该参加哪个活动或采取行动。

1-Toast.makeText(context, "Enter All Details", Toast.LENGTH_SHORT).show();它用在这个。Context context = ActivityName.this;

2-startActivity(new Intent(context,LoginActivity.class));

在这种情况下意味着您要从哪个活动转到其他活动。上下文或ActivityName.this比getContext和getApplication atinContext更快。

将Context视为一个具有不同资源的框:字符串、颜色和字体。如果您需要资源,请转到此框。当您转屏时,此框会发生变化,因为方向更改为横向。

有关上下文的更多详细信息,请阅读这个文章。我将简要解释一下。

如果你想知道什么是上下文,你必须知道它的作用…
例如getContext()获取上下文信息是检索上下文的方法之一。在getContext()中,上下文与活动及其生命周期相关联。我们可以将上下文想象为位于活动后面的层,它将与活动的生命一样长。活动死亡的那一刻,上下文也会。此方法给出活动的功能列表,例如:

Load Resource Values,Layout Inflation,Start an Activity,Show a Dialog,Start a Service,Bind to a Service,Send a Broadcast,Register BroadcastReceiver.

现在想象一下:

上下文是位于其组件后面的层(接口)(活动,应用程序…)和组件的生命周期,它提供访问应用程序支持的各种功能环境和Android框架。

Context是Android提供的抽象类,因此是它的工作是将您的应用程序代码与Android系统连接起来。通过从Context(活动、服务和您的应用程序)继承的类,您的应用程序获得了访问只有操作系统才能访问的资源和功能的能力。

当操作系统(通过OS控制的实例化机制,如“intents”)实例化上下文后代对象时,它们将由操作系统管理,因此,它们获得生命周期。

对于其他任何事情,方法调用中的将上下文作为参数传递允许此方法使用上下文作为与操作系统通信的通道,以便到达操作系统并要求它执行一些操作或返回一些资源。

与清单一起可视化上下文

在此处输入图片描述

为了可视化Android上下文和清单,一个旧的呼叫中心总机是一个很好的类比。

基础是Android系统,其中连接每个正在运行的应用程序的所有应用程序组件的所有电线都出现了。

  1. 每个“总机应用程序”都包含一些插孔,它们代表应用程序的清单组件声明。因此,通过清单声明,Android系统了解这些插孔的存在,因此它可以通过通过意图创建对象来插入新的上下文线。

  2. 每条线路代表一个连接到应用程序的某个可启动组件或应用程序本身的Android Context。您可以使用现有的线路,因为它与Android系统连接,以便请求需要通过操作系统才能完成的各种事情。

  3. 你可以假设当一个活动被销毁时,它的电线被拔掉。当另一个活动(或另一个组件)被构造时,一条新电线出现并连接到正确的清单声明的插孔。

我写了一篇完整的文章来解释Context如何将您的应用程序与Android系统耦合

Context到底是什么?

根据Android参考留档,它是一个表示各种环境数据的实体。它提供对本地文件、数据库、与环境关联的类加载器、服务(包括系统级服务)等的访问。在本书中以及在您使用Android的日常编码中,您将看到Context经常传递。

摘自“实践中的Android”一书,第60页。

一些Android API需要Context作为参数

如果你浏览各种Android API,你会发现请注意,它们中的许多都将android.content.Context对象作为参数。您还会看到活动或服务通常用作Context。这之所以有效,是因为这两个类都从Context扩展而来。

如果你查看https://stackoverflow.com/a/16301475/1772898的评论,你会发现ulf-edholm的评论

嗯,对我来说,这一切听起来都像是我们老前辈用来称之为全局变量的东西,当面向对象进入场景时,这是非常不赞成的

他是对的。上下文是全局变量的替代品。

为了简单起见,我们可以这样说:global variable ≈ context

上下文相对于全局变量的好处是,全局变量使得不可能在同一进程中创建同一系统的两个独立实例,而上下文允许系统的多个实例在单个进程中共存,每个实例都有自己的上下文。

请查看John Ousterhout的软件设计哲学,7.5直通变量。

全局变量使得不可能创建两个独立的变量同一进程中同一系统的实例,因为访问全局变量将冲突

我最常用的解决方案是引入一个上下文对象,如图7.2(d)。上下文存储应用程序的所有全局状态(任何否则将成为传递变量或全局的东西变量)。大多数应用程序在其全局中有多个变量状态,表示配置选项、共享子系统和性能计数器。每个都有一个上下文对象上下文允许系统的多个实例系统共存于单个进程中,每个进程都有自己的上下文。

稍后在评论部分,您将找到bjornw的另一条评论

如果你只是grep一个代码库,你会看到数百个不同的getContext,getBaseContext,getBlaBlaContext。

他也是对的。

为了减少必须了解上下文的方法数量,在许多主要对象中引用了对上下文的引用。这就是为什么你会在这么多地方看到getContext、getBaseContext、getBlaBlaContext…

参考:John Ousterhout的软件设计哲学,7.5直通变量。

不幸的是,上下文可能需要在许多地方,所以它可能会成为一个传递变量。要减少必须知道它的方法的数量,对上下文的引用可以保存在系统的大多数主要对象中。在图7.2(d),包含m3的类存储了对上下文作为其对象中的实例变量。当一个新对象创建,创建方法从其中检索上下文引用对象并将其传递给新对象的构造函数。使用此方法,上下文无处不在,但它只显示为构造函数中的显式参数。