繁体   English   中英

Java中静态方法的范围

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM