JavaRush/Java блог/Архив info.javarush/Есть ли разница где инициализировать переменную?
BigVOVA
30 уровень

Есть ли разница где инициализировать переменную?

Статья из группы Архив info.javarush
участников
Дошел до 28 уровня. И неожиданно осознал, что я не понимаю есть ли разница инициализации переменной при ее объявлении или в конструкторе который у нас присутствует явно. Для примера возьмем final которую обязаны инициализировать. Пожалуйста, на "пальцах" разъясните разницу между примерами: a) public class Test { private String name; private final Object obj = new Object(); public AdvertisementManager(String name) { this.name = name; } } b) public class Test { private String name; private final Object obj; public AdvertisementManager(String name) { this.name = name; obj = new Object(); } }
Комментарии (3)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
BigVOVA
Уровень 30
13 сентября 2015, 23:50
AndreGold спасибо за ответ, плюсую! Но работа конструктора мне понятна. Меня интересует именно мой частный случай. Т.е. final инициализируется одним значением для всех экземпляров. Но в первом варианте при объявлении, а во втором в конструкторе. Есть разница?
AndreGold
Уровень 28
14 сентября 2015, 01:52
Нет, разницы нет(это если говорить о том, где иницализировать). Вопрос лишь в инициализации, т.е. сразу при создании, либо в конструкторе.

Не обязательно инициализировать final переменную во время объявления. Инициализация может производиться позже, но должна быть выполнена перед первым использованием переменной. Такая final переменная называется «blank final». Если вы создаете переменную член blank final, вы должны инициализировать ее в каждом конструкторе. Это очевидно, потому что компилятор не может снаружи прослеживать все возможные последовательности потоков кодов, которые могут обращаться к этой переменной. Если бы он мог, то вам не нужен был бы отладчик! Точно так же, если локальная переменная создается как blank final, вы должны инициализировать ее перед первым использованием. Как только blank final инициализирована, ее значение не может быть изменено.
Вот ссылка на статью.

Только в Вашем случае а), это скорее константа уровня обьекта класса(еще есть константы уровня класса static final). Т.е. все обьекты с одной и той же константой.

Что касается b), то инициализируя в конструкторе мы присваиваем константе final каждого обьекта новое значение.
P.S. если я в чем то неправ, то разжуйте и мне.
AndreGold
Уровень 28
13 сентября 2015, 21:36
a)
public class Test {
        private String name;
        private final String str;

        public Test (String name, String str) {
            this.name = name;
            this.str = new String(str);
    }


    public static void main(String[] args) {
        Test testFirst = new Test("Good", "Day");
        Test testSecond = new Test("Day", "Good");

        System.out.println(testFirst.str.toString());
        System.out.println(testSecond.str.toString());
    }

Вывод
Day
Good
b)
public class TestExample {
    private String name;
    private final String str = new String("Good");

    public TestExample(String name) {
        this.name = name;
    }


    public static void main(String[] args) {
        TestExample testFirst = new TestExample("Привет");
        TestExample testSecond = new TestExample("меня");
        TestExample testThird = new TestExample("меня");

        System.out.println(testFirst.str.toString());
        System.out.println(testSecond.str.toString());
        System.out.println(testThird.str.toString());
    }
}

Вывод
Good
Good
Good

Когда final переменная инициализированна, изменить ее значение не удасться. Это к слову об b). Попробуйте сколько бы вы обьектов не создали, значение переменной останеться неизменной для каждого обьекта. Что касается a), то конструктор дает нам возможность инициализировать каждый раз при создании обьекта final переменную новым значением.