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

时间:2010-12-09 20:55:58

标签: 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”。这意味着静态变量不是全局变量,而只是全局到单个执行!!!

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

请建议。

6 个答案:

答案 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类的主方法和副反之亦然。我已经在我的系统上测试了它。