0

Java中静态方法的范围是什么?

1) (Eclipse) Project level
2) Application level
3) JVM level

为了让您深入了解我在问什么,如果我们有课:

public class MyClass
{
   private static int data;
   public static void setData(int val)
   {
       data = val;
   }
   public static int getData()
   {
       return data;
   }
}

如果我setData()从不同的类(在同一个项目中MyClass)调用该方法并传递一个值,比如 10,我是否能够data从不同的项目访问该集合(即值 10)?来自不同的应用程序?ETC-

或者,我究竟需要做什么才能data从不同的(eclipse)项目访问相同的(即 10 个)?

如果有关于此的官方文档,请告诉我。

4

5 回答 5

2

您是在询问参考范围还是存在范围?给定标准 Java 包命名/范围规则,任何可以访问该方法的类的类都可以访问公共静态方法。请注意,这意味着(作为规则的一部分)只能访问同一 JVM 中的类。

数据存在范围仅限于表示正在加载的类的实例(我确信对此有一些花哨的术语)。最多直到 JVM 执行结束,但在某些情况下,可以更早地“卸载”一个类。java.lang.Class

还应该注意的是,给定类的多个副本(java.lang.Class实例)可以同时加载到给定的 JVM 中,并且该类的每个副本都有自己的静态变量。然而,这将是非常罕见的。

于 2013-09-21T01:06:33.060 回答
1

假设您正在谈论是否存在一个“实例”data和相应的静态方法。

Java中静态方法的范围是什么?

1)(Eclipse)项目级别

不会。源代码/构建时“项目”结构与 Java 程序的运行时行为直接相关。(项目构建生成一个或多个 .class 文件,通常捆绑为 JAR 或 WAR 或 EAR 或任何存档文件。运行时行为取决于这些文件如何加载到 JVM 中。)

2) 应用层 3) JVM 层

是的,不,也许。

实际的“存在范围”(正如有人描述的那样)取决于类类型的标识。在正常情况下,一个类被加载到一个 JVM 中一次。这为您提供了一种类类型,并且该类型有一个静态变量的实例。

但是,如果您的类加载器以正确的方式组织,您可以再次加载该类。这为您提供了一个新的类类型(与前一个名称相同......但类加载器不同),并且该类类型有自己的一组静态变量。

java通过其方法使用命令运行的应用程序main通常只会加载一次类。(您通常需要在运行时创建一个新的类加载器来更改它。)

但是,在框架内运行的应用程序(例如 webapps)受制于框架所做的任何事情。典型的 appserver 框架为每个 webapp 使用单独的类加载器。因此,如果您在多个 Web 应用程序中包含一个 JAR 文件并在同一个应用程序服务器中运行它们,您可能会得到多个具有相同名称和不同类加载器的类类型......以及不同的静态变量集。

但它并没有就此结束,因为当您调用MyClass.getData()另一个类(例如OtherClass)时,访问的变量取决于代码绑定到MyClass的类型。OtherClass这取决于OtherClass类型的类加载器将它绑定到什么......当它加载OtherClass类时。

这一切都会变得相当复杂,但通常你不需要担心它。复杂性只有在某些事情正在做“聪明的类加载器的东西”时才会发生,甚至,聪明的东西通常是实现你想要发生的“应用程序”的分离。

于 2013-09-21T02:10:28.220 回答
0

static方法没有特殊的范围。范围是通过使用访问说明符来定义的。由于您已经定义了静态方法,public因此它将对相同或不同包中的所有类可见。

如果你想在不同的项目中使用它,那么要么在新项目中导入当前项目的源代码,要么创建当前项目的 jar 并将其添加到新项目的类路径中。

于 2013-09-21T01:00:47.490 回答
0

你混合了两个概念的儿子。static 意味着每个类都有一个实例。

范围取决于访问修饰符(private、public、protected、default)

如果你想从其他 eclipse 项目中访问这个方法,你需要把这个项目添加到项目库中。

右键单击您的新项目,选择构建路径,然后添加到构建路径转到项目选项卡,然后添加具有此 getDate 方法的项目。

现在您可以访问您的班级 MyClass

于 2013-09-21T02:00:35.683 回答
0

不完全是你问的,但我相信它可以帮助你理解 static方法的概念。

比方说,你有Foo静态方法calculateFoo1()静态方法 的类calculateFoo2()

非静态方法只能与object此类(类instance)关联使用。因此,在调用它之前,您需要实例化该对象。

Foo f2 = new Foo();
cf.calculateFoo2;

可以使用类名调用静态方法,而无需此类实例。

Foo.calculateFoo1();

您也可以使用此类的实例调用静态方法(如果有的话)。编译器会明白的。

于 2013-09-21T01:28:08.690 回答