Статические блоки инициализации - PullRequest
244 голосов
/ 10 марта 2010

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

Но я не понимаю, зачем нам для этого нужен специальный блок. Например, мы объявляем поле как статическое (без присвоения значения). А затем напишите несколько строк кода, которые генерируют и присваивают значение объявленному выше статическому полю.

Зачем нам нужны эти строки в специальном блоке, например: static {...}?

Ответы [ 14 ]

0 голосов
/ 10 мая 2019
static int B,H;
static boolean flag = true;
static{
    Scanner scan = new Scanner(System.in);
    B = scan.nextInt();
    scan.nextLine();
    H = scan.nextInt();

    if(B < 0 || H < 0){
        flag = false;
        System.out.println("java.lang.Exception: Breadth and height must be positive");
    } 
}
0 голосов
/ 20 октября 2016

Сначала вы должны понять, что сами классы вашего приложения создаются для java.class.Class объектов во время выполнения. Это когда ваши статические блоки запускаются. Таким образом, вы можете сделать это:

public class Main {

    private static int myInt;

    static {
        myInt = 1;
        System.out.println("myInt is 1");
    }

    //  needed only to run this class
    public static void main(String[] args) {
    }

}

и выводит «myInt is 1» на консоль. Обратите внимание, что я не создал ни одного класса.

0 голосов
/ 03 августа 2016

В качестве дополнения, как сказал @Pointy

Код в «статических» разделах будет выполняться при загрузке класса время, прежде чем будут созданы какие-либо экземпляры класса (и до любые статические методы вызываются из других источников).

Предполагается добавить System.loadLibrary("I_am_native_library") в статический блок.

static{
    System.loadLibrary("I_am_a_library");
}

Это гарантирует отсутствие вызова собственного метода перед загрузкой соответствующей библиотеки в память.

Согласно loadLibrary из оракула :

Если этот метод вызывается более одного раза с одним и тем же именем библиотеки, второй и последующие вызовы игнорируются.

Так что совершенно неожиданно установка System.loadLibrary не используется, чтобы избежать многократной загрузки библиотеки.

0 голосов
/ 14 октября 2012

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

Eg:-class Solution{
         // static int x=10;
           static int x;
       static{
        try{
          x=System.out.println();
          }
         catch(Exception e){}
        }
       }

     class Solution1{
      public static void main(String a[]){
      System.out.println(Solution.x);
        }
        }

Теперь мой статический int x будет динамически инициализироваться ..Bcoz, когда компилятор перейдет в Solution.x, он загрузит класс решения и загрузку статического блока во время загрузки класса .. Так что мы можем динамически инициализировать этот статический член данных ..

}

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