静态字符串难题神秘行为

时间:2013-10-22 14:31:10

标签: java static behavior

我有两节课。课程Test和课程Application。测试类implements Runnable,当然是一个线程。

这两个类都有public static void main。

  

首先:

首先,我启动Test类,其中有一个类级变量" a"

public static String a = "abc";

指向一个字符串对象,在线程内部我只是为它分配一个新值并打印该值。

  

其次:

我启动了我的Application类,它也有一个主方法,我只是在课程Static String中打印了Test,而且令人惊讶的是它打印了#34; 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);

    }
}

1 个答案:

答案 0 :(得分:3)

每个进程都有自己的静态字段副本。

但是,每个进程也会运行类初个化程序,因此该字段的每个副本都会初始化为abc