Final class java что это

Классы и объекты

Классы

Java позволяет создавать классы, которые представляют объекты из реального мира. Например, можно создать класс Car (автомобиль) или Animal (животное) и задать им различные свойства. Для класса Car логично создать такие свойства как двери, колёса, лобовое стекло и т.д. Имея класс Car, можно создать новые классы Легковушки, Грузовики, Автобусы, которые будут иметь все свойства класса Car, а также свои собственные свойства. У класса Animal соответственно можно задать свойства Лапы, Хвост, а затем создать наш любимый класс Cat, у которого будет ещё дополнительное свойство Усы. Иными словами, классы могут наследовать свойства от других классов. Родительский класс называется суперклассом. Внутри классов могут быть объявлены поля и методы.

Для объявления класса служит ключевое слово class. Вспомним стандартную строчку кода из Android-проекта:

Упрощённая общая форма для класса может иметь следующий вид:

В Java принято начинать имена класса с большой буквы. В классе могут быть несколько переменных и методов. Переменные, определённые внутри класса (не метода), называются переменными экземпляра или полями (fields). Код пишется внутри класса. Методы и переменные внутри класса являются членами класса.

Объекты

Новый объект (или экземпляр) создаётся из существующего класса при помощи ключевого слова new:

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

Если вы помните, при объявлении примитивных типов мы указывали нужный тип в самом начале.

Поэтому код Cat barsik также определяет его тип. Он не всегда может совпадать с именем класса.

В этом примере используется тип класса домашних любимцев Pet, а обращаемся к классу котов Cat.

Простой пример создания класса Box (коробка для кота):

При таком варианте Java автоматически присвоит переменным значения по умолчанию. Например, для int это будет значение 0. Но не всегда значения по умолчанию подойдут в вашем классе. Если вы создали переменную для описания количества лап у кота, то логично сразу присвоить значение 4. Поэтому считается хорошей практикой сразу присваивать нужные значения полям класса, не полагаясь на систему.

Вам нужно создать отдельный файл Box.java, в который следует вставить код, описанный выше. О том, как создавать новый файл для класса я не буду здесь расписывать.

Красивая получилась коробочка.

Final class java что это. Смотреть фото Final class java что это. Смотреть картинку Final class java что это. Картинка про Final class java что это. Фото Final class java что это

Объект catBox, объявленный в коде вашей программы, сразу займёт часть памяти на устройстве. При этом объект будет содержать собственные копии переменных экземпляра width, height, depth. Для доступа к этим переменным используется точка (.). Если мы хотим присвоить значение переменной width, то после создания объекта класса можете написать код:

Если мы хотим вычислить объём коробки, то нужно перемножить все значения размеров коробки:

Каждый объект содержит собственные копии переменных экземпляра. Вы можете создать несколько объектов на основе класса Box и присваивать разные значения для размеров коробки. При этом изменения переменных экземпляра одного объекта никак не влияют на переменные экземпляра другого объекта. Давайте объявим два объекта класса Box:

Обычно такую конструкцию из двух строк кода не используют на практике, если нет особых причин.

Когда мы используем ключевое слово new и указываем имя класса, то после имени ставим круглые скобки, которые указывают на конструктор класса. О них поговорим позже.

Ключевое слово final

Поле может быть объявлено как final (финальное). Это позволяет предотвратить изменение содержимого переменной, по сути, это становится константой. Финальное поле должно быть инициализировано во время его первого объявления.

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

Кроме полей, final можно использовать для параметров метода (препятствует изменению в пределах метода) и у локальных переменных (препятствует присвоению ей значения более одного раза).

Также слово final можно применять к методам, чтобы предотвратить его переопределение.

Иногда требуется проверить, к какому классу принадлежит объект. Это можно сделать при помощи ключевого слова instanceof. Это булев оператор, и выражение foo instanceof Foo истинно, если объект foo принадлежит классу Foo или его наследнику, или реализует интерфейс Foo (или, в общем виде, наследует класс, который реализует интерфейс, который наследует Foo).

Возьмём пример с рыбками, которые знакомы котам не понаслышке. Пусть у нас есть родительский класс Fish и у него есть унаследованные подклассы SaltwaterFish и FreshwaterFish. Мы можем протестировать, относится ли заданный объект к классу или подклассу по имени

Оператор import сообщает компилятору Java, где найти классы, на которые ссылается код. Любой сложный объект использует другие объекты для выполнения тех или иных функций, и оператор импорта позволяет сообщить о них компилятору Java. Оператор импорта обычно выглядит так:

В Android Studio импорт класса происходит автоматически при наборе кода. Также это срабатывает и при вставке кода. Если имена классов совпадают, то студия может запросить помощь. Тогда вам нужно вручную указать нужное полное имя класса.

Импорт позволяет избежать долгого набора имени класса. Без импорта нам пришлось бы писать все классы в коде программы полностью.

Статический импорт

Существует ещё статический импорт, применяемый для импорта статических членов класса или интерфейса. Это позволяет сократить количество кода. Например, есть статические методы Math.pow(), Math.sqrt(). Для вычислений сложных формул с использованием математических методов, код становится перегружен. К примеру, вычислим гипотенузу.

В данном случае без указания класса не обойтись, так как методы статические. Чтобы не набирать имена классов, их можно импортировать следующим образом:

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

Второй допустимый вариант, позволяющий сделать видимыми все статические методы класса:

В этом случае вам не нужно импортировать отдельные методы. Но такой подход в Android не рекомендуется, так как требует больше памяти.

Класс Class

На первый взгляд, класс Class звучит как «масло масляное». Тем не менее, класс с таким именем существует и он очень полезен.

Программно получить имя класса

Иногда из программы нужно получить имя используемого класса. Для этого есть специальные методы getClass().getName() и другие родственные методы. Допустим, нам нужно узнать имя класса кнопки, на которую мы нажимаем в программе.

getSimpleName() возвращает только имя класса без пакета, другие методы вернут полное название.

Если нужно узнать имя класса активности, то достаточно кода:

Если вам известно имя класса, то можете получить сам класс:

Метод getSuperclass() возвращает имя суперкласса. Остальные несколько десятков методов не столь популярны.

Источник

BestProg

Содержание

Поиск на других ресурсах:

1. Какое назначение использования спецификатора final в программах на Java?

Спецификатор final предназначен для объявления неизменных данных, методов и классов. Неизменные данные, методы или классы не могут изменять свое значение или программный код на протяжении выполнения всей программы.

Спецификатор final может применяться к таким элементам языка как:

Существуют два способа установить начальное значение неизменных данных:

4. Какое отличие между неизменными и изменяемыми данными? Какие особенности неизменных данных в классе?

Между неизменными данными и изменяемыми данными есть два следующих отличия:

5. Пример, который демонстрирует применение спецификатора final с одиночными данными (переменными)

Класс также содержит объявление трех конструкторов, которые инициализируют начальными значениями те неизменные ( final ) данные, которые при объявлении не получили никаких значений.

Реализация класса имеет следующий вид:

В вышеприведенном коде, неизменные данные (поля) a и f есть пустыми константами, которые обязательно должны быть инициализированы в конструкторе класса.

Использование класса SetConstData может быть следующим:

Компилятор Java такое описание пропускает с предупреждением

что означает, что данные могли быть неинициализированы.

8. Какие особенности неизменных данных, которые объявлены как статические ( static )?

В сравнении с нестатическими, для статических неизменных данных можно выделить следующие особенности:

9. Что такое пустые константы?

Пустые константы – это поля класса, которые объявляются со спецификатором final но которые не инициализированы начальным значением (которым не было присвоенное начальное значение).

Значение пустой константы обязательно должны инициализироваться в конструкторе класса.

10. Могут ли статические ( static ) поля данных класса быть пустой константой?
11. Что такое неизменные аргументы? Пример

Программный код класса FinalArguments следующий

Ниже приведено использование методов класса FinalArguments

Если метод Sqr() в классе FinalArguments переписать, например, следующим образом

то компилятор выдаст ошибку

12. Для чего используются неизменные методы?

В языке программирования Java спецификатор final можно ставить перед объявлением метода. Такой метод называется неизменным методом.

Неизменный метод объявляется в следующих случаях:

13. Что такое inline-методы?

В большинстве языков программирования обычный вызов метода из некоторого кода требует выполнения следующей последовательносты обязательных операций:

Inline-методы – это методы, тело которых непосредственно вставляется в программный код вызывающей программы (метода). В этом случае отсутствуют лишние шаги при вызове метода: занесение аргументов в стек, переход и возврат из метода. Отсутствие лишних шагов приводит к повышению скорости выполнения вызванного метода. То есть, увеличивается общее быстродействие программы, которая вызвала метод.

Однако, если тело inline-метода есть довольно большим (содержит много кода), то это приводит к чрезмерному увеличению программы, которая его вызвала.

14. Пример объявления и использования неизменных методов

Объявление классов A и B имеет вид:

Использование экземпляров классов A и B может быть, например, следующим

Если в классе B попробовать объявить методы Set() и Get() следующим образом

то компилятор выдаст ошибку

15. Какие особенности использования спецификаторов final и private для методов?
16. Может ли неизменный метод быть объявлен как статический ( static )?

Да. В этом случае, вызов статического неизменного метода из класса такой же как и обычного статического метода (без спецификатора final ).

17. Что такое неизменные классы? В каких случаях целесообразно применять неизменные классы? Пример

Пример. Пусть задано объявление неизменного класса A :

После такого объявления, объявить класс, который наследует (расширяет) класс A нельзя. Если попробовать это сделать, то компилятор выдаст ошибку.

компилятор выдает ошибку:

Источник

Какой смысл «финального класса» в Java?

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

Когда полезно объявить класс как окончательный, это описано в ответах на этот вопрос:

В каком-то смысле да.

Помечая класс как окончательный, вы отключаете мощную и гибкую функцию языка для этой части кода. Однако некоторые классы не должны (и в некоторых случаях не могут ) разрабатываться для надлежащего учета подклассов. В этих случаях имеет смысл пометить класс как окончательный, даже если он ограничивает ООП. (Помните, однако, что последний класс все еще может расширять другой не финальный класс.)

В Java элементы с final модификатором не могут быть изменены!

Это включает в себя финальные классы, финальные переменные и финальные методы:

Один сценарий, в котором важен final, когда вы хотите предотвратить наследование класса по соображениям безопасности. Это позволяет вам убедиться, что выполняемый вами код не может быть переопределен кем-либо.

открытый финальный класс String

который является неизменным классом и не может быть расширен. Конечно, это нечто большее, чем просто сделать финал класса неизменным.

Соответствующее чтение: принцип Открытого и закрытого Боба Мартина.

Ключевая цитата:

Программные объекты (классы, модули, функции и т. Д.) Должны быть открыты для расширения, но закрыты для модификации.

final Ключевым словом является средством для обеспечения соблюдения этого в Java, будь то используется на методах или классы.

Здесь нет нарушения принципов ОО, финал просто обеспечивает хорошую симметрию.

На практике вы хотите использовать final, если хотите, чтобы ваши объекты были неизменяемыми, или если вы пишете API, чтобы сигнализировать пользователям API о том, что класс просто не предназначен для расширения.

Я слышал, что класс маркировки final повышает эффективность, но, честно говоря, я не мог найти этот аргумент, чтобы иметь большой вес.

Если Java является объектно-ориентированным, и вы объявляете класс финальным, разве это не останавливает идею класса, имеющего характеристики объектов?

Возможно, да, но иногда это является целью. Иногда мы делаем это для достижения большей пользы от безопасности и т. Д., Жертвуя способностью этого класса расширяться. Но последний класс все еще может расширять один класс, если это необходимо.

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

final class можно избежать взлома публичного API при добавлении новых методов

Предположим, что в версии 1 вашего Base класса вы делаете:

Затем, если в версии 2 вы хотите добавить method метод для Base :

это сломало бы клиентский код.

Если бы мы использовали final class Base вместо этого, клиент не смог бы наследовать, и добавление метода не сломало бы API.

Для пояснения, маркировка класса final не помечает его поля как final таковые, и поэтому не защищает свойства объекта, а реальную структуру класса.

РЕШЕНИЕ ЗАДАЧИ ЗАКЛЮЧИТЕЛЬНОГО КЛАССА:

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

К сожалению, поскольку единственный конструктор класса является закрытым, расширить этот класс невозможно. В случае с классом Test нет причин, по которым класс должен быть окончательным. Класс Test является хорошим примером того, как неявные конечные классы могут вызывать проблемы.

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

Предотвращение подкласса класса может быть особенно полезным, если вы пишете API или библиотеки и хотите избежать расширения для изменения базового поведения.

Одно из преимуществ сохранения класса как финального:

Класс String остается окончательным, чтобы никто не мог переопределить его методы и изменить функциональность. Например, никто не может изменить функциональность метода length (). Он всегда будет возвращать длину строки.

Разработчик этого класса не хотел, чтобы кто-то изменил функциональность этого класса, поэтому он сохранил его как окончательный.

В Java окончательное ключевое слово используется для случаев ниже.

В java конечные переменные не могут переназначаться, конечные классы не могут расширяться, а конечные методы не могут переопределяться.

Финальные занятия не могут быть продлены. Поэтому, если вы хотите, чтобы класс вел себя определенным образом, а кто-то не переопределял методы (возможно, с менее эффективным и более вредоносным кодом), вы можете объявить весь класс как финальные или особые методы, которыми вы не хотите быть. изменилось.

Поскольку объявление класса не препятствует созданию экземпляра класса, это не означает, что он не даст классу иметь характеристики объекта. Просто вам придется придерживаться методов так, как они объявлены в классе.

Я должен отметить, что ничто не мешает вам наследовать класс «должен быть помечен как окончательный». Но это обычно классифицируется как «злоупотребление наследованием», и это делается потому, что чаще всего вы хотели бы унаследовать некоторую функцию от базового класса в вашем классе.

Как было сказано выше, если вы хотите, чтобы никто не мог изменить функциональность метода, вы можете объявить его как окончательный.

Пример: путь к файлу сервера приложений для загрузки / выгрузки, разбиение строки на основе смещения, такие методы вы можете объявить как Final, чтобы эти функции метода не были изменены. И если вам нужны такие конечные методы в отдельном классе, определите этот класс как класс Final. Таким образом, в классе Final будут все методы final, а метод Final может быть объявлен и определен в классе non-final.

Класс Android Looper является хорошим практическим примером этого. http://developer.android.com/reference/android/os/Looper.html

Класс Looper предоставляет определенные функциональные возможности, которые НЕ предназначены для переопределения каким-либо другим классом. Следовательно, здесь нет подкласса.

Теперь позвольте GrumpyEmployee подклассу Employee и переопределить greet метод, как показано ниже.

Финальный класс не может быть продлен дальше. Если нам не нужно делать класс наследуемым в Java, мы можем использовать этот подход.

Если нам просто нужно создать определенные методы в классе, чтобы они не были переопределены, мы просто можем поставить перед ними ключевое слово final. Там класс все еще наследуется.

Объявление финала класса имеет смысл во многих случаях. Любой объект, представляющий «ценность», такую ​​как цвет или сумма денег, может быть конечным. Они стоят сами по себе.

Если вы пишете библиотеки, сделайте ваши классы окончательными, если вы явно не сделаете отступ для их производных. В противном случае люди могут получить ваши классы и переопределить методы, нарушив ваши предположения / инварианты. Это также может иметь последствия для безопасности.

Джошуа Блох в «Эффективной Java» рекомендует явно разрабатывать наследование или запрещать его, и отмечает, что проектирование наследования не так просто.

Источник

What is the point of «final class» in Java?

I am just new to programming and I am wondering if programmers actually use this on their programs. If they do, when do they use it so I can understand it better and know when to use it.

Final class java что это. Смотреть фото Final class java что это. Смотреть картинку Final class java что это. Картинка про Final class java что это. Фото Final class java что это

24 Answers 24

First of all, I recommend this article: Java: When to create a final class

If they do, when do they use it so I can understand it better and know when to use it.

A final class is simply a class that can’t be extended.

When it’s useful to declare a class as final is covered in the answers of this question:

By marking a class as final you disable a powerful and flexible feature of the language for that part of the code. Some classes however, should not (and in certain cases can not) be designed to take subclassing into account in a good way. In these cases it makes sense to mark the class as final, even though it limits OOP. (Remember however that a final class can still extend another non-final class.)

Final class java что это. Смотреть фото Final class java что это. Смотреть картинку Final class java что это. Картинка про Final class java что это. Фото Final class java что это

In Java, items with the final modifier cannot be changed!

This includes final classes, final variables, and final methods:

Final class java что это. Смотреть фото Final class java что это. Смотреть картинку Final class java что это. Картинка про Final class java что это. Фото Final class java что это

One scenario where final is important, when you want to prevent inheritance of a class, for security reasons. This allows you to make sure that code you are running cannot be overridden by someone.

The best example is

which is an immutable class and cannot be extended. Of course, there is more than just making the class final to be immutable.

Final class java что это. Смотреть фото Final class java что это. Смотреть картинку Final class java что это. Картинка про Final class java что это. Фото Final class java что это

If you imagine the class hierarchy as a tree (as it is in Java), abstract classes can only be branches and final classes are those that can only be leafs. Classes that fall into neither of those categories can be both branches and leafs.

There’s no violation of OO principles here, final is simply providing a nice symmetry.

In practice you want to use final if you want your objects to be immutable or if you’re writing an API, to signal to the users of the API that the class is just not intended for extension.

Relevant reading: The Open-Closed Principle by Bob Martin.

Key quote:

Software Entities (Classes, Modules, Functions, etc.) should be open for Extension, but closed for Modification.

The final keyword is the means to enforce this in Java, whether it’s used on methods or on classes.

Final class java что это. Смотреть фото Final class java что это. Смотреть картинку Final class java что это. Картинка про Final class java что это. Фото Final class java что это

I have heard that marking class final improves efficiency but frankly I could not find this argument to carry much weight.

If Java is object oriented, and you declare a class final, doesn’t it stop the idea of class having the characteristics of objects?

Perhaps yes, but sometimes that is the intended purpose. Sometimes we do that to achieve bigger benefits of security etc. by sacrificing the ability of this class to be extended. But a final class can still extend one class if it needs to.

On a side note we should prefer composition over inheritance and final keyword actually helps in enforcing this principle.

Источник

Как работает ключевое слово final в Java? (Я все еще могу изменить объект.)

Приведенный выше код работает нормально и без ошибок.

Теперь измените переменную как static :

Теперь это ошибка компиляции. Как это final на самом деле работает?

19 ответов

В Java нет концепции неизменяемости объектов; это достигается за счет тщательного проектирования объекта, и это далеко не тривиальная задача.

Прежде всего верны. Кроме того, если вы не хотите, чтобы другие создавали подклассы из вашего класса, объявите ваш класс окончательным. Затем он становится конечным уровнем иерархии вашего дерева классов, и никто не может расширить его дальше. Рекомендуется избегать огромной иерархии классов.

Это очень хороший вопрос для собеседования. Иногда они могут даже спросить вас, в чем разница между конечным и неизменяемым объектами.

1) Когда кто-то упоминает конечный объект, это означает, что ссылку нельзя изменить, но его состояние (переменные экземпляра) можно изменить.

Ref переменную x можно изменить, чтобы указать другую строку, но значение «abc» изменить нельзя.

3) Переменные экземпляра (нестатические поля) инициализируются при вызове конструктора. Таким образом, вы можете инициализировать значения переменных внутри конструктора.

5) Статическая переменная инициализируется во время загрузки класса. Таким образом, вы не можете инициализировать внутри конструктора, это нужно сделать еще до него. Поэтому вам нужно присвоить значения статической переменной во время самого объявления.

Ключевое слово Final можно использовать по-разному:

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

В приведенном выше случае мы определили конструктор для Test и дали ему метод setFoo.

О методе: метод можно вызывать сколько угодно раз (даже никогда), и компилятор знает об этом.

Сценарий 1

Сценарий 2

Сценарий 3

final классы не могут быть подклассами
final методы не могут быть переопределены. (Этот метод находится в суперклассе)
final методы можно переопределить. (Прочтите это грамматически. Этот метод находится в подклассе)

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

Ключевое слово final может использоваться в нескольких местах.

final class означает, что no другой класс может расширять этот последний класс. Когда Java Run Time ( JRE ) знает, что ссылка на объект относится к типу конечного класса (скажем, F), она знает, что значение этой ссылки может быть только в типе выключенный.

Поэтому, когда он выполняет какой-либо метод этого объекта, этот метод не нуждается в разрешении во время выполнения с использованием виртуальная таблица . т.е. не может быть применен полиморфизм времени выполнения. Так что время выполнения не заботится об этом. Это означает, что это экономит время обработки, что улучшает производительность.

final method любого класса означает, что любой дочерний класс, расширяющий этот класс, не может переопределить этот последний метод (ы). Таким образом, поведение во время выполнения в этом сценарии также полностью совпадает с предыдущим поведением, которое я упоминал для классов.

Для полей локальные параметры

Для параметров метода

Таким образом, во всех трех вышеупомянутых сценариях, когда мы не указали ключевое слово final в тех местах, которые мы можем использовать, нам не о чем беспокоиться, оптимизация компилятора сделает это за нас. Оптимизация компилятора делает за нас и множество других вещей. 🙂

Ниже приведены различные контексты, в которых используется final.

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

Переменной final может быть присвоено значение позже (не обязательно для присвоения значения при объявлении), но только один раз.

Заключительные классы Последний класс не может быть расширен (унаследован)

Прежде всего, место в вашем коде, где вы инициализируете (т.е. назначаете впервые) foo, находится здесь:

Это приведет к ошибке компиляции.

Когда у вас НЕТ ключевого слова static, каждый объект, который создает экземпляр класса, имеет свою собственную копию foo. Следовательно, конструктор присваивает значение пустой новой копии переменной foo, что совершенно нормально.

Когда вы делаете его static final, он должен быть инициализирован в блоке статической инициализации

Прочтите все ответы.

Может использоваться для переменной, которую нельзя изменять.

Предположим, у вас есть две копилки, красная и белая. Вы назначаете эти копилки только двум дочерним элементам, и им не разрешается менять свои ящики местами. Итак, у вас есть красные или белые копилки (финал), вы не можете модифицировать ящик, но можете положить деньги в свой ящик. Никого не волнует (Модификация-2).

Замораживание полей final происходит в двух сценариях:

Давайте нарушим закон

Почему? Потому что отражение похоже на Чака Норриса, и если оно хочет изменить значение инициализированного поля final, оно это делает. Некоторые говорят, что это он сам помещает новые значения в стек:

Когда мы используем ключевое слово final с объявлением переменной, значение, хранящееся внутри этой переменной, не может быть изменено позже.

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

Преимущества использования последнего ключевого слова рассматриваются в эту ветку.

Стоит упомянуть несколько простых определений:

Классы / методы

Переменные

После инициализации переменной final она всегда содержит одно и то же значение.

final в основном избегают перезаписи / надпечатки чем-либо (подклассы, переменная «переназначить»), в зависимости от случая.

Ключевое слово final в java используется для ограничения пользователя. Ключевое слово java final может использоваться во многих контекстах. Финал может быть:

Конечная переменная Java:

Пример переменной final

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

Последний класс Java:

Пример выпускного класса

Последний метод Java:

Пример метода final (run () в Honda не может переопределить run () в Bike)

Если вы делаете foo статическим, вы должны инициализировать его в конструкторе класса (или встроенном, где вы его определяете), как в следующих примерах.

Конструктор класса (не экземпляр):

Модификатор final обеспечивает инициализацию вашей ссылки к моменту завершения вызова вашего конструктора (т.е. вы должны инициализировать его в конструкторе).

Когда вы инициализируете атрибут in-line, он инициализируется до того, как код, который вы определили для конструктора, запускается, поэтому вы получаете следующие результаты:

Ошибка, которую вы получаете в своем коде, связана с тем, что static<> запускается при загрузке класса до того, как вы создадите экземпляр объекта этого класса. Таким образом, вы не инициализировали foo при создании класса.

Боковое примечание:

Модификатор final обеспечивает постоянство только для примитивных типов и ссылок.

Ключевое слово final можно интерпретировать двумя разными способами в зависимости от того, для чего оно используется:

Таким образом, final List foo; гарантирует, что foo всегда ссылается на один и тот же список, но содержимое указанного списка может со временем измениться.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *