Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Почему все переменные в интерфейсе являются final?

#java #ооп #наследование #интерфейс


И всетаки, почему все переменные в интерфейсе являются final? Для чего это ключевое
слово тут? В чем его смысл?

Для чего вообще это ключевое слово там?

Пусть бы они были не final! 

Что тогда?
    


Ответы

Ответ 1



Интерфейс определяет поведение объектов, а не конкретную реализацию. Если бы мы могли переопределять значения в дочерних интерфейсах или классах, реализующих этот интерфейс, то часть нашего интерфейса становилась бы частью конкретной реализации, что нарушало бы исходное понятие термина "интерфейс". Поскольку создавать экземпляры интерфейса нельзя и интерфейс не должен быть связан с конкретной реализацией, то неявно используется ключевое слово static (то есть данное поле определено в контексте, где нет никаких объектов). Отсутствие модификатора final также приводило бы к неоднозначности и путанице, поскольку каждый класс/интерфейс мог бы по своему усмотрению изменять это значение, что влияло бы на другие классы/интерфейсы. Но тут стоит заметить, что неизменяемость характерна для примитивных типов данных и immutable классов, для остальных же классов - final гарантирует только неизменяемость ссылки на область памяти, в которой расположен объект. Поля самого объекта при этом могут быть изменяемы. Если предположить возможность, что интерфейс может иметь нестатические изменяемые поля, то тогда бы возникла проблема с ромбовидным наследованием (diamond inheritance). Допустим, есть интерфейс A, в котором определено поле int v = 10. От этого интерфейса наследуются два других интерфейса B и C, каждый из которых переопределяет нашу переменную v (например, в B имеем значение 15, а в C - 20). Теперь мы определяем еще один интерфейс D, который наследуется от B и C. Тогда возникает вопрос: какое значение поле v должно унаследовать?

Ответ 2



final использует для того что бы переменному давали значение только один раз. К примеру: Если классу дали final тогда нельзя из этого класса создать подкласс. Если в классе есть методы с final. И вы создаете подклассы, Вы не сможете Переписать (Overwrite) этот метод. Это удобно, когда Вам не хочется что бы метод переписивали, и использовали в других целях. Примеру, функция sin(x). Если переменная имеет final, тогда вы можете передать значение этому переменному только 1 раз. Далже компилятор не дасть изменять значение. Это Удобно когда нужно объявлять константы. Что бы не чайно не изменить значение Переменной-константы. К примеру, pi = 3.1415

Комментариев нет:

Отправить комментарий