我对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”。这意味着静态变量不是全局变量,而只是全局到单个执行!!!
与实例变量相比,还要创建静态变量资源吗?
请建议。
答案 0 :(得分:8)
这意味着静态变量不是全局变量,而只是全局到单个执行!!!
他们当然是。 未保存到某种存储(如硬盘)的所有变量不会在程序的不同执行之间保留其值。
答案 1 :(得分:2)
加载类时初始化该值。因此,每次执行代码时,都会将其初始化为类中定义的值“Java”。新值不会保存,只会在内存中更改,并在重新执行代码时“重置”。
全局一词与变量持久性无关,而范围仅在正在运行的程序中定义。
答案 2 :(得分:1)
@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的范围是部署级别。
答案 3 :(得分:0)
静态变量是“每个类”。因此,如果此类中的静态变量与其他类中的静态变量具有相同的名称/类型,则无关紧要。
在某种意义上它是全局的,无论你有多少个对象,如果你让它们使用静态变量,它们都会使用一个var。
答案 4 :(得分:0)
您有两个不同的主电源,这意味着它将有两个不同的执行路径。您可以从一个或另一个开始,更改的静态变量的值仅针对当前执行进行更改,在不同的执行中它始终重置为默认值。
尽量不要使用第二个主要方法,而是使用静态方法,然后在更改后在第一个主方法上调用它,然后会看到不同的结果。
答案 5 :(得分:0)
您只能从命令行一次执行一个类,并且在您的程序中有两个类具有main方法,如果您一次运行Second类,那么它将不会执行Third类的主方法和副反之亦然。我已经在我的系统上测试了它。