2013-10-22 20 views
0

我有兩個類。類別Test和類別Application。測試類implements Runnable,是一個線程..當然。靜態字符串難題神祕行爲

這兩個類都有public static void main。

第一:

首先,我啓動Test類,其中有一類級別變量「a」

public static String a = "abc"; 

一個指向字符串對象和裏面我的主題只需分配一個新值並打印該值即可。

其次:

啓動我Application類也有一個主要的方法,我只是印在Static StringTest類和令人驚訝地打印「ABC」。請注意,我在開始Test課程後發佈了第二堂課。理想情況下,它應該打印NULL,因爲Java Sandbox中的每個進程都運行並且一個進程不應訪問其他進程。

現在我的問題是爲什麼?爲什麼它不應該打印新的分配的字符串。我給下面

import java.util.Date; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

/** 
* 
* @author AZ 
*/ 
public class Test implements Runnable { 

    public static String a = "abc"; 


    @Override 
    public void run(){ 

     while(true){ 
      System.out.println(a); 
      a = new Date().toString(); 
      try { 
       Thread.sleep(2000); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     }  
    } 
} 
class ThreadRunner { 
    static public void main(String args[]){ 
     new Thread(new Test()).start(); 
    } 
} 

二等兩類

import com.springhibernate.beans.MessageBean; 
import com.springhibernate.beans.Test; 
import org.springframework.beans.factory.annotation.Autowired; 

/** 
* 
* @author AZ 
*/ 
public class Application { 


    public static void main(String args[]){ 


     System.out.println("Test of printing String " + Test.a); 

    } 
} 

回答

3

每個進程都有自己的靜態字段的副本。

但是,每個進程也運行類初始化程序,因此該字段的每個副本初始化爲abc

+0

這意味着如果有一個靜態類,它也應該在多次運行中加載兩次 –

+0

請給我推薦任何書。我想進一步瞭解JVM和與之相關的東西。 –