带程序代码的静态字段

xhi*_*ist 2 java static

我已经知道在类中你可以声明变量和方法.如果首选,它们都可以声明为静态.

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

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

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

如果我执行

MyCars myCars = new MyCars();
Run Code Online (Sandbox Code Playgroud)

以下将按此顺序发生?

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

    public MyCars()
    {
         volvo.setBrand = "Volvo";
         volvo.setModel = "XC70";
                 (4)
    }
Run Code Online (Sandbox Code Playgroud)

这是原始代码:

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));
    }
Run Code Online (Sandbox Code Playgroud)

Ama*_*dan 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)
Run Code Online (Sandbox Code Playgroud)