带程序代码的静态字段

时间:2012-01-03 08:53:40

标签: java static

我了解到在类中你可以声明变量和方法。如果首选,它们都可以声明为静态。

现在我遇到了一个我不太懂的程序示例。在类中的一些变量声明之后,有一个声明为static的字段,里面有程序代码。

这段代码什么时候执行?我的猜测是,在创建新对象时,代码执行如下:

  1. 实例变量的内存分配。
  2. 执行连接到实例变量的构造函数。
  3. 执行静态字段
  4. 执行构造函数(如果在创建对象时使用“= new Constructor())
  5. 如果我执行

    MyCars myCars = new MyCars();
    

    以下将按此顺序发生?

    public class MyCars
    {
        private Car volvo = new Car()
     //              (1)       (2)
        static
        {
            volvo.setNumberOfWheels = 4;
     //                  (3)
        }
    
        public MyCars()
        {
             volvo.setBrand = "Volvo";
             volvo.setModel = "XC70";
                     (4)
        }
    

    以下是原始代码:

    public class SettingsSetter extends ListActivity
    {
        private static Map<Integer,String> menuActivities=new HashMap<Integer,String>();
        private static List<BooleanSetting> settings=new ArrayList<BooleanSetting>();
    
        static 
        {
            menuActivities.put(R.id.app,
                Settings.ACTION_APPLICATION_SETTINGS);
            menuActivities.put(R.id.security, Settings.ACTION_SECURITY_SETTINGS);
            menuActivities.put(R.id.wireless,
                Settings.ACTION_WIRELESS_SETTINGS);
            menuActivities.put(R.id.all,
                Settings.ACTION_SETTINGS);
    
            settings.add(new BooleanSetting(Settings.System.INSTALL_NON_MARKET_APPS,
                "Allow non-Market app installs", true));
            settings.add(new BooleanSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED,
                "Use haptic feedback", false));
            settings.add(new BooleanSetting(Settings.System.ACCELEROMETER_ROTATION,
                "Rotate based on accelerometer", false));
        }
    

3 个答案:

答案 0 :(得分:5)

静态初始化程序在加载类时执行,因此在创建任何实例之前。您的第一个代码出错,因为volvo是一个实例(非静态)变量,静态块无法访问它。重温你的例子:

public class MyCars
{
    private static Car audi = new Car()
 //                     (2)
    private Car volvo = new Car()
 //              (5)       (6)
    static
    {
        audi.setNumberOfWheels = 4;
 //                  (3)
    }
    public MyCars()
    {
         volvo.setBrand = "Volvo";
         volvo.setModel = "XC70";
 //              (7)
    }
}

MyCars myCars = new MyCars();
// (1)                (4)

答案 1 :(得分:0)

这不是一个字段,它是一个静态初始化器。首次加载类时,它将执行一次。当初始化类的实例时, not 将被执行。

顺便说一句,您的MyCars代码将无法编译,因为静态初始化程序无法引用实例变量,因为它将在该类的任何实例之前执行。

答案 2 :(得分:0)

它是一个静态块,或者是一个静态初始化块,在将类加载到JVM中时执行。无论你有什么,它都会在加载时自动执行。

同一个类中也可以有多个静态块,JVM可以按照它们出现的顺序执行它们。