Java中静态方法的范围

时间:2013-09-21 00:59:41

标签: java eclipse

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,我将能够访问该集合{来自不同项目的{1}}(即价值10)?来自不同的应用程序?等 -

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

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

5 个答案:

答案 0 :(得分:2)

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

数据存在的作用域是java.lang.Class的实例,它表示正在加载的类(我确定这个有一些奇特的术语) )。最多这个是在JVM执行结束之前,但是在某些情况下,类可以更早地“卸载”。

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

答案 1 :(得分: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类型{{1}代码已绑定到。这取决于OtherClass类型的类加载器将其绑定到什么...加载OtherClass类时。

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

答案 2 :(得分:0)

static方法没有特殊范围。范围由访问说明符的使用定义。正如您已将静态方法定义为public所以它对于相同或不同包中的所有类都是可见的。

如果要在不同的项目中使用它,则可以在新项目中导入当前项目的源,也可以创建当前项目的jar并将其添加到新项目的类路径中。

答案 3 :(得分:0)

不完全是您的要求,但我相信它可能有助于您理解static方法的概念。

假设您使用静态方法Foo非静态方法calculateFoo1()

进行课程calculateFoo2()

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

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

可以使用Class name调用静态方法,而不使用此类的实例。

Foo.calculateFoo1();

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

答案 4 :(得分:0)

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

范围取决于访问修饰符(私有,公共,受保护,默认)

如果要从其他eclipse项目访问此方法,则需要将此项目添加到项目库中。

右键单击新项目,选择Build Path,然后选择Add to Build Path 转到项目选项卡,然后添加具有此getDate方法的项目。

现在您可以访问您的MyClass类