[英]Scope of static methods in Java
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;
}
}
如果我从另一个类(与MyClass
在同一项目中)调用setData()
方法并传递一个值(例如10),我将能够从另一个项目访问集合data
(即值10) ? 来自其他应用程序? 等等-
或者,我究竟需要做些什么才能能够从另一个(Eclipse)项目访问相同data
(即10)?
如果有与此相关的官方文档,请告诉我。
您是在询问参考范围还是存在范围? 给定标准Java包命名/作用域规则,可以访问该方法的类的任何类都可以访问该公共静态方法。 请注意,这意味着(作为规则的一部分)访问仅对同一JVM中的类可用。
数据的存在范围限定于java.lang.Class
的实例,该实例表示要加载的类(我敢肯定有一些特别的术语)。 最多直到JVM执行结束为止,但是在某些情况下,可以更早地“卸载”类。
还应该注意,给定类的一个以上副本( java.lang.Class
实例)可以同时加载到给定的JVM中,并且该类的每个副本都有其自己的静态变量。 但是,这种情况很少见。
让我们假设您正在谈论是否有一个data
“实例”和相应的静态方法。
Java中静态方法的范围是什么?
1)(Eclipse)项目级别
否。源代码/构建时间“项目”结构与Java程序的运行时行为直接相关。 (项目构建生成一个或多个.class文件,通常将它们捆绑为JAR或WAR或EAR或任何归档文件。运行时行为取决于将这些文件加载到JVM中的方式。)
2)应用程序级别3)JVM级别
是的,不,也许。
实际的“存在范围”(正如某人所描述的)取决于类类型的标识。 通常情况下,一次将一个类加载到JVM中。 这为您提供了一种类类型,并且该类型有一个静态变量实例。
但是,如果以正确的方式组织了类加载器,则可以再次加载类。 这为您提供了一个新的类类型(与上一个类具有相同的名称...,但具有不同的类加载器),并且该类类型具有自己的一组静态变量。
使用java
命令通过其main
方法运行的应用程序通常只会加载该类一次。 (您通常需要在运行时创建一个新的类加载器以更改此设置。)
但是,在框架内运行的应用程序(例如,webapps)将受框架的约束。 典型的appserver框架为每个webapp使用单独的类加载器。 因此,如果您在多个Web应用程序中包含一个JAR文件并在同一个应用服务器中运行它们,则可能会获得具有相同名称,不同类加载器....和不同静态变量集的多个类类型。
但这还不止于此,因为当您在另一个类(例如OtherClass
)中调用MyClass.getData()
时,访问的变量取决于OtherClass
代码绑定到的MyClass
类型。 这取决于OtherClass
类型的类加载器在加载OtherClass
类时将其绑定到...的OtherClass
。
这一切都可能变得相当复杂,但是通常您不必担心。 仅当某些事情在做“聪明的类加载器”时,才发生复杂性,甚至,聪明的事情通常是实现想要发生的“应用程序”的分离。
static
方法没有特殊的范围。 范围是通过使用访问说明符来定义的。 正如您将静态方法定义为public
那样,它对于相同或不同包中的所有类都是可见的。
如果要在其他项目中使用它,则可以在新项目中导入当前项目的源代码,也可以创建当前项目的jar并将其添加到新项目的类路径中。
不完全是您的要求,但是我相信它可以帮助您了解static
方法的概念。
假设您有Foo
类,其静态方法为calculateFoo1()
, 非静态方法为calculateFoo2()
非静态方法只能与该类的object
(类instance
)关联使用。 因此,在调用它之前,您需要实例化该对象。
Foo f2 = new Foo();
cf.calculateFoo2;
可以使用没有此类的实例的类名称来调用静态方法。
Foo.calculateFoo1();
您也可以使用此类的实例调用静态方法(如果有的话)。 编译器会明白的。
您混合了两个概念的儿子。 静态表示每个类只有一个实例。
范围取决于访问修饰符(私有,公共,受保护,默认)
如果要从其他Eclipse项目访问此方法,则需要将此项目添加到项目库中。
右键单击新项目,选择“构建路径”,然后选择“添加到构建路径”。转到“项目”选项卡,然后添加具有此getDate方法的项目。
现在您可以访问班级MyClass
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.