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)?
如果有关于此的官方文档,请告诉我。
答案 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)
范围取决于访问修饰符(私有,公共,受保护,默认)
如果要从其他eclipse项目访问此方法,则需要将此项目添加到项目库中。
右键单击新项目,选择Build Path,然后选择Add to Build Path 转到项目选项卡,然后添加具有此getDate方法的项目。
现在您可以访问您的MyClass类