Когда эта переменная stati c инициализируется и когда использовать StringBuffer - PullRequest
0 голосов
/ 29 мая 2020

Я только что видел этот пример

public class Runtime {
    //When is this private member initalised ??
    private static Runtime currentRuntime = new Runtime();


    public static Runtime getRuntime() {
        return currentRuntime;
    }

Теперь, когда вы вызываете Runtime.getRuntime (), currentRuntime уже инициализирован, даже экземпляр этого класса никогда не создавался. Как это работает?

Мой второй вопрос о StringBuffer?

String var = "Hello World";

Теперь, если вы сделаете var = var + "!";

Что лучше использовать StringBuffer. Я имею в виду, что StringBuffer резервирует много памяти, я думаю, по крайней мере, 1000Byte, поэтому просто для этого простого примера было бы лучше не использовать StringBuffer. Конечно, теперь у нас есть 2 строки в памяти «Hello World» и «Hello World!». но все же лучше, чем StringBuffer с 1000 байтами или более. Верно?

1 Ответ

0 голосов
/ 29 мая 2020

Я отвечу: «когда эта статическая c переменная инициализируется»

Я испытал, что Java классы загружаются, когда они нужны. Например, если вы никогда его не используете (например, вы никогда не ссылаетесь на переменную или не вызываете функцию / конструктор), JVM не инициализирует класс.

Итак, когда вы вызываете Runtime.getRuntime () , затем инициализируется класс и поля stati c.

Вы также можете протестировать его, используя блоки stati c с этим кодом

public class MainClass {
    public static void main(String[] args) {
        System.out.println("program starts");
        Runtime.getRuntime();
        System.out.println("programs end");
    }
}
public class Runtime {
    //When is this private member initalised ??
    private static Runtime currentRuntime = new Runtime();

    static {
        System.out.println("when this is called the class is beeing initialized");
        System.out.println("is currentRuntime null? -> " + (currentRuntime == null));
    }

    public static Runtime getRuntime() {
        System.out.println("getRuntime is executed");
        return currentRuntime;
    }
}

Это что я получаю на консоли

program starts
when this is called the class is beeing initialized
is currentRuntime null? -> false
getRuntime is called
programs end

Что это значит? Что класс Runtime (и его поля) не инициализируется перед запуском main (), но он инициализируется, когда Runtime запрашивается .

Кроме того, stati * Блок 1029 * вызывается, когда currentRuntime не является нулевым, поэтому он уже инициализирован (помните, что Java идет сверху вниз).

Итак, он инициализируется, когда Runtime.getRuntime () вызывается, но перед его выполнением

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