所以我在几年前有一个相当复杂的applet结构,我对其中的全局类有疑问。基本上,我在同一页面上有三个小程序,它们以不同的方式相互交互。我很困惑的部分是它们都在同一个类中共享全局(静态)变量。究竟是怎么回事?我的印象是每个applet都有自己的小环境,因此无法访问与其他applet相同的静态变量?例如,如果我在小程序A:
中有这个Globals.globalVar = 5;
这在applet B中:
int x = Globals.globalVar;
我确保B在A之后启动,然后x将变为5.我想知道在JVM中这是如何处理的,因为它对我来说没有任何意义。这种行为是否意味着如果您有两个单独的Java应用程序同时运行,它们可以访问彼此的静态变量?先谢谢。
答案 0 :(得分:4)
因为它是如何定义的,出于向后兼容的原因。见http://download.oracle.com/javase/6/docs/technotes/guides/jweb/applet/applet_execution.html#cache:
通常,如果两个applet具有相同的代码库和存档 参数,它们将由同一个类加载器实例加载。 向后兼容性需要此行为,并且依赖于此行为 通过几个真实的应用程序。结果就是多重 同一网页上的小程序可以访问彼此的静态变量 在Java语言级别,有效地允许多个applet 被写成好像它们只包含一个应用程序。
虽然此功能可以启用某些类型的应用程序 写得方便,有一定的弊端。它会干扰 终止applet,特别是当多个实例时 相同的小程序是活动的。它为applet创建了编程模型 更复杂,因为它在静态时指定的确切 applet的字段将被重新初始化,以及它们何时出现 从运行到同一applet的运行维护。它导致不精确 Java Plug-in中某些用户界面操作的行为 由于无法准确识别哪个applet发起了 特别要求。
出于这个原因,新的Java Plug-in提供了一种选择退出的方法 在applet的基础上在applet上使用类加载器缓存。