Java中的静态变量和方法的范围

我对Java中静态方法的使用有些怀疑。 我读了很多地方静态变量是独立于实例的,所以是全局的。

public class ThirdClass { public static var = "Java"; } public class Second { public static void main(String[] args) { ThirdClass ob1 = new ThirdClass(); System.out.println(ob1.var); // prints Java ob1.var="Ruby"; ThirdClass ob2 = new ThirdClass(); System.out.println(ob2.var); // prints Ruby } } public class First { public static void main(String[] args) { ThirdClass ob3 = new ThirdClass(); System.out.println(ob1.var); // prints Java again!!! } } 

正如您在第二类中看到的,ThirdClass的多个实例共享变量var的相同实例。 但是First类中的一个单独的实例不能访问最终值“Ruby”,而是显示原始的“Java”。 这意味着静态变量不是全局变量,而只是全局到单个执行!

与实例变量相比,还要创建静态变量资源密集型吗?

请建议。

这意味着静态变量不是全局变量,而只是全局到单个执行!

他们当然是。 所有未持久存储到某种存储的变量(如硬盘)都不会在程序的不同执行之间保留其值。

加载类时初始化该值。 因此,每次执行代码时,都会将其初始化为类中定义的值“Java”。 新值不会保存,只会在内存中更改,并在再次执行代码时“重置”。

术语全局与变量持久性无关,并且范围仅在正在运行的程序中定义。

@eternal我想我得到了你想要的点。 我在Jboss上测试了这个(有一些小的编译更改)。 结果是:一旦部署,类ThirdClass的范围似乎是应用程序部署级别。 并且在多个方法调用时保留var的静态值。

这是我使用的基本结构。

 public class ThirdClass { public static var = "Java"; } public class Second class{ public void testA { ThirdClass ob1 = new ThirdClass(); // not needed , just kept for clarity. System.out.println(ThirdClass.var); ThirdClass.var="Ruby"; ThirdClass ob2 = new ThirdClass(); System.out.println(ThirdClass.var); } public class First { public void testB { ThirdClass ob3 = new ThirdClass(); System.out.println(ThirdClass.var); ThirdClass.var="CSHARP"; } public void testC { ThirdClass ob4 = new ThirdClass(); System.out.println(ThirdClass.var); } 

通过webservices调用(我有一个设置)在secquence中调用这些方法testA() – >显示var =“Ruby”

testB() – >显示var =“Ruby”

testC() – >显示var =“CSHARP”

因此,通过应用程序部署,不同的方法调用共享新的更改值。 因此,ThirdClass的范围是部署级别。

静态变量是“每个类”。 因此,此类中的静态变量与其他类的名称/类型相同并不重要。

它是全局的,无论你有多少个对象,如果你让它们使用静态变量,它们都将使用一个var。

你有两个不同的主电源,这意味着它将有两个不同的执行路径。 您可以从一个或另一个开始,更改的静态变量的值仅针对当前执行而更改,在不同的执行中它始终重置为默认值。

尽量不要使用第二个主要方法,而是使用静态方法,然后在更改后在第一个主方法上调用它,然后您将看到不同的结果。

您只能从命令行一次执行一个类,并且在您的程序中,如果您一次运行第二个类,则有两个具有main方法的类,然后它将不执行第三个类的main方法,反之亦然。 我在我的系统上测试过它。