#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
Комментариев нет:
Отправить комментарий