метод static () (без объявления) - PullRequest
3 голосов
/ 03 ноября 2011

У меня есть следующий класс:

public abstract class A()
{
   public static final SomeString = null;

   static()
   {
       SomeString = "aaa";
   }
}

Когда и как вызывается этот статический метод?

Какова цель создания такого статического метода (без имени / типа возврата)

Ответы [ 4 ]

7 голосов
/ 03 ноября 2011

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

public abstract class A()
{
   public static String SomeString = null;

   static
   {
       SomeString = "aaa";
   }
}

Самый простой способ инициализации полей (статических или экземпляров) в Java во время их объявления - это простопредоставляя значение постоянной времени компиляции совместимого типа данных.Например:

public class InitializationWithConstants{

public static int staticIntField = 100;
private boolean instanceBoolField = true;

}

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

Здесь возникает необходимость в статических блоках инициализации и блоках инициализатора для инициализации статических полей и полей экземпляров, соответственно.

Это обычный блок кода, заключенный в пару фигурных скобок и предшествующий емупо «статическому» ключевому слову.Эти блоки могут быть где угодно в определении класса, где у нас может быть поле или метод.Среда выполнения Java гарантирует, что все статические блоки инициализации вызываются в том порядке, в котором они появляются в исходном коде, и это происходит при загрузке класса в память.

public class InitializationWithStaticInitBlock{

public static int staticIntField;
private boolean instanceBoolField = true;

static{
 //compute the value of an int variable 'x'
 staticIntField = x;
}
}

Поскольку блоки статической инициализации фактически являютсякодовые блоки, чтобы они позволили нам инициализировать даже те статические поля, которые требуют некоторой логической обработки, чтобы получить их начальные значения.

0 голосов
/ 03 ноября 2011

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

0 голосов
/ 03 ноября 2011

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

По сути, блок статического инициализатора - это фрагмент кода, который выполняется при загрузке класса и может использоваться для инициализации статических полей в классе.

Пример:

public abstract class A
{
    public static final String SomeString;

    static
    {
        System.out.println("static{}");    
        SomeString = "aaa";
    }    

    public static void main(String[]args)
    {
        System.out.println("main");    
    }
}

Вывод:

static{}
main
0 голосов
/ 03 ноября 2011

Ваш синтаксис неверен;должно быть:

public abstract class A()
{
    public static final String SomeString;

    static
    {
        SomeString = "aaa";
    }
}

Блок static позволяет инициализировать статические переменные, когда класс загружается, когда эта инициализация сложнее, чем просто = something;.

Ссылка

...