Статическое поле с кодом программы - PullRequest
2 голосов
/ 03 января 2012

Я узнал, что в классе вы можете объявлять переменные и методы.Они оба могут быть объявлены как статические, если это предпочтительнее.

Теперь я столкнулся с примером программы, который мне не совсем понятен.После объявления некоторой переменной в классе есть поле, объявленное как статическое, а внутри - программный код.

Когда выполняется этот код?Я предполагаю, что код выполняется следующим образом при создании нового объекта:

  1. Распределение памяти для переменных экземпляра.
  2. Выполнение контуров, связанных с переменными экземпляра.
  3. Исключение из статического поля
  4. Выполнение конструктора (если "= новый конструктор () используется при создании объекта)

Если я выполню

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 ]

5 голосов
/ 03 января 2012

Статические инициализаторы выполняются при загрузке класса, поэтому перед созданием каких-либо экземпляров.Ваш первый код содержит ошибку, поскольку 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)
0 голосов
/ 03 января 2012

Это статический блок, или статический блок инициализации, который выполняется, когда класс загружается в JVM.Что бы у вас ни было внутри, оно будет автоматически выполнено во время загрузки.

Также возможно иметь несколько статических блоков внутри одного класса, JVM гарантирует, что они будут выполнены в порядке их появления.1003 *

0 голосов
/ 03 января 2012

Это не поле, это статический инициализатор.Он будет выполнен один раз при первой загрузке класса. не будет выполняться при инициализации экземпляра класса.

Кстати, ваш код MyCars не будет компилироваться, поскольку статический инициализатор не может ссылаться на переменные экземпляра, как это будетвыполняется до появления экземпляров класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...