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
AndreGold спасибо за ответ, плюсую! Но работа конструктора мне понятна. Меня интересует именно мой частный случай. Т.е. final инициализируется одним значением для всех экземпляров. Но в первом варианте при объявлении, а во втором в конструкторе. Есть разница?
AndreGold Уровень 28
13 сентября 2015
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 переменную новым значением.