Java - инициализация мгновенного члена с помощью конечного метода

Я инициализирую переменную экземпляра через окончательный метод с помощью этого кода:

public class Whatever {
    private int myVar = initializeInstanceVariable();

    protected final int initializeInstanceVariable() {
        return 10;
    }

    public static void main(String[] args) {
        Whatever myVar2 = new Whatever();
        myVar2.initializeInstanceVariable();

        System.out.println(myVar2.myVar);
    }
}

Согласно этому учебнику:

http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

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

Мой вопрос: какую проблему может вызвать метод без ключевого слова final? Я запускал код с ключевым словом final и без него, и результат был таким же, без каких-либо ошибок компиляции.


person Community    schedule 03.05.2014    source источник
comment
Вы могли бы быть на пути к ответу, если бы спросили: «Какая разница между final и методом?». Это связано с наследованием.   -  person Praba    schedule 03.05.2014
comment
Добавляя к моему комментарию, проверьте stackoverflow.com/q/7477553/2231632, чтобы понять, почему это так.   -  person Praba    schedule 03.05.2014


Ответы (1)


во-первых, в соответствии с вашей текущей программой, это не влияет на использование окончательного варианта или его неиспользование.

потому что ключевое слово final появляется, когда мы идем на наследование.

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

случай 1: если у вас нет окончательного метода. тогда все не окончательные методы могут быть переопределены в подклассе, и, следовательно, есть вероятность изменить значение вашей переменной с помощью метода подкласса overrden.

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

случай 2: если у вас есть ключевое слово final в методе.

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

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

Примечание: final следует использовать, если в будущем вы не хотите что-то менять.

см. ниже программу, как это влияет без ключевого слова final

package com.kb;

public class Whatever {
    private int myVar = initializeInstanceVariable();

    protected  int initializeInstanceVariable() {
        return 10;
    }

    public static void main(String[] args) {
        Whatever myVar2 = new Whatever();
        myVar2.initializeInstanceVariable();

        System.out.println(myVar2.myVar);

        Whatever var = new AAA();
        System.out.println(var.myVar);
    }
}

class AAA extends Whatever{
    @Override
    protected int initializeInstanceVariable() {
        return 20;
    }
}

еще одна вещь, вам не нужно снова вызывать метод myVar2.initializeInstanceVariable(); в вашем сценарии.

потому что вы вызвали метод при инициализации переменной.

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

означает, что метод будет вызываться автоматически, и вы получите значение.

поэтому строки ниже будут работать так же, если мы также прокомментируем вызов метода.

 Whatever myVar2 = new Whatever();
  //  myVar2.initializeInstanceVariable();

    System.out.println(myVar2.myVar);
person Karibasappa G C    schedule 03.05.2014