final string java что значит

Ключевое слово “final” в Java

Узнайте, что означает ключевое слово final в Java применительно к классам, методам и переменным.

1. Обзор

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

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

2. Заключительные занятия

Любая попытка наследовать от класса final приведет к ошибке компилятора. Чтобы продемонстрировать это, давайте создадим final класс Cat :

И давайте попробуем его расширить:

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

Мы просто не можем его продлить.

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

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

3. Окончательные методы

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

Давайте создадим класс Dog и сделаем его sound() метод final :

Теперь давайте расширим класс Dog и попробуем переопределить его метод sound() :

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

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

Во втором случае мы не можем этого сделать.

4. Конечные переменные

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

4.1. Конечные примитивные переменные

Давайте объявим примитивную конечную переменную i, затем присвоим ей 1.

И давайте попробуем присвоить ему значение 2:

4.2. Конечные Опорные переменные

Чтобы продемонстрировать это, давайте объявим final ссылочную переменную cat и инициализируем ее:

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

Но мы можем изменить свойства экземпляра Cat :

4.3. Заключительные поля

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

Для статических конечных полей это означает, что мы можем их инициализировать:

Например, final поля, это означает, что мы можем их инициализировать:

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

4.4. Заключительные Аргументы

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

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

5. Заключение

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

Источник

Использование Final, Finally и Finalize на Java

Если у вас есть какой-либо опыт интервью, вы могли заметить, что интервьюеры, как правило, задают сложные вопросы, которые обычно берутся из базовых понятий. Один из таких вопросов, который чаще всего задают, заключается в различении между Final, Finally and Finalize на Java.

Что такое Java final?

В Java final – это ключевое слово, которое также можно использовать в качестве модификатора доступа. Другими словами, final ключевое слово используется для ограничения доступа пользователя. Он может использоваться в различных контекстах, таких как:

С каждым из них последнее ключевое слово имеет разный эффект.

1. Переменная

Всякий раз, когда ключевое слово final в Java используется с переменной, полем или параметром, это означает, что после передачи ссылки или создания экземпляра его значение не может быть изменено во время выполнения программы. Если переменная без какого-либо значения была объявлена как final, тогда она называется пустой / неинициализированной конечной переменной и может быть инициализирована только через конструктор.

Давайте теперь посмотрим на пример.

2. Метод

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

Давайте посмотрим на пример.

3. Класс

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

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

Давайте посмотрим на пример.

Блок Finally

В Java, Finally, является необязательным блоком, который используется для обработки исключений. Обычно ему предшествует блок try-catch. Блок finally используется для выполнения важного кода, такого как очистка ресурса или освобождение использования памяти и т. д.

Блок finally будет выполняться независимо от того, обрабатывается ли исключение или нет. Таким образом, упаковка кодов очистки в блок finally считается хорошей практикой. Вы также можете использовать его с блоком try без необходимости использовать блок catch вместе с ним.

Читайте также:  ccupdate exe что это

Метод Finalize

Finalize – это защищенный нестатический метод, который определен в классе Object и, таким образом, доступен для всех без исключения объектов в Java. Этот метод вызывается сборщиком мусора до полного уничтожения объекта.

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

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

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

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

Источник

Почему класс String объявлен final в Java?

С тех пор, как я узнал, что класс java.lang.String объявлено как final в Java, мне было интересно, почему это? Тогда я не нашел ответа, но этот пост:Как создать реплику класса String в Java? напомнил мне о моем запросе.

конечно, String предоставляет все функции, которые мне когда-либо нужны, и никогда не думал о какой-либо операции, которая потребует расширения строки класса, но все равно вы никогда не узнаете, что кому-то может понадобиться!

Итак, кто-нибудь знает, каковы были намерения дизайнеров, когда они решили сделать его окончательным?

16 ответов

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

одно преимущество неизменяемые объекты это

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

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

это хорошая статья это описывает две причины, уже упомянутые в приведенных выше ответах:

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

расширение строки будет играть хаос с равными и стажером. JavaDoc говорит равно:

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

или JVM может заблокировать это отверстие, убедившись, что в пул добавлены только конкретные строковые объекты (и никаких подклассов).

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

была ли строка изменяемой или не окончательной, запрос на загрузку «java.Ио.Writer «можно было бы изменить на load» mil.vogoon.DiskErasingWriter»

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

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

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

Как сказал Бруно, речь идет о неизменности. Речь идет не только о строках, но и о любых оболочках, например Double, Integer, Character и т. д. Для этого есть много причин:

Aditionally final в Java не обязательно означает, что объект не может измениться (он отличается, например, от C++). Это означает, что адрес, на который он указывает, не может изменить, но можно изменить его свойства и/или атрибуты. Поэтому понимание разницы между неизменностью и окончательностью в некоторых случаях может быть действительно важным.

возможно, это было для упрощения реализации. Если вы создаете класс, который будет наследуемым пользователями класса, у вас есть целый новый набор вариантов использования для рассмотрения в вашем дизайне. Что произойдет, если они сделают то или иное с X-пропектированным полем? Делая его окончательным, они могут сосредоточиться на правильной работе публичного интерфейса и убедиться, что он твердый.

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

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

Читайте также:  intel collaborative processor performance control cppc driver что это

если вы видите String класс has объявляется как

если это уже компьютер просто вернуть значение.

Ну, у меня есть некоторые другие мысли, я не уверен, правильно ли я или нет, но в Java String является единственным объектом, который можно рассматривать как примитивный тип данных, а также я имею в виду, что мы можем создать объект String как имя строки= «java». Теперь, как и другие примитивные типы данных, которые копировать по значению не скопировать ссылки ожидается, что строка будет иметь такое же поведение, поэтому строка является окончательной. Так я и думал. Пожалуйста, игнорируйте, если его полностью нелогичный.

окончательность строк также защищает их как стандарт. В C++ вы можете создавать подклассы string, поэтому каждый магазин программирования может иметь свою собственную версию string. Это привело бы к отсутствию строгих стандартов.

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

[edit]Ах, получение более невежественных голосов. Ответ совершенно серьезен. Мне пришлось несколько раз программировать свой путь вокруг глупой реализации строки, что привело к серьезной потере производительности и производительности

помимо очевидных причин, предложенных в других ответах, одна мысль о том, чтобы сделать класс String final также может быть связана с накладными расходами производительности виртуальных методов. Помните строки тяжелого класса, что делает этот финал, значит, нет суб-реализация наверняка, означает нет косвенность вызова вл-либо. Конечно, теперь у нас есть такие вещи, как virtual invoke и другие, которые всегда делают такую оптимизацию для вас.

знает ли JVM, что является неизменяемым? Ответ-Нет, постоянный пул содержит все неизменяемые поля, но все неизменяемые поля / объекты не хранятся только в постоянном пуле. Только мы его реализовать таким образом, что она достигает immutablity и его особенности. CustomString может быть реализован без его окончательного использования MarkerInterface, который обеспечит специальное поведение java для его объединения, функция все еще ожидается!

однако вопрос OP заключается в том, почему он окончательный-почему он не может быть расширен. Некоторые здесь взяли это на себя, но я бы согласился с ОП, что здесь есть реальный пробел. Другой язык позволяет разработчикам создавать новые номинальные типы тип. Например, в Haskell я могу создать следующие новые типы, идентичные тексту во время выполнения, но обеспечивающие безопасность привязки во время компиляции.

поэтому я бы выдвинул следующее предложение в качестве улучшения языка Java:

(или, возможно, мы могли бы начать отучать себя от Java)

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

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

Источник

Почему класс String объявлен в Java окончательным?

Когда я узнал, что класс java.lang.String объявлен в Java как final, мне стало интересно, почему это так. Тогда я не нашел ответа, но этот пост: Как создать реплику класса String в Java? напомнил мне о моем вопросе.

Конечно, String предоставляет все функции, которые мне когда-либо были нужны, и я никогда не думал о какой-либо операции, которая потребовала бы расширения класса String, но все же вы никогда не узнаете, что кому-то может понадобиться!

Итак, кто-нибудь знает, в чем заключались намерения дизайнеров, когда они решили сделать его окончательным?

Одно из преимуществ неизменяемых объектов состоит в том, что

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

Если бы String не был final, вы могли бы создать подкласс и иметь две строки, которые выглядят одинаково, когда «рассматриваются как строки», но на самом деле они разные.

Это хорошая статья, в которой изложены две причины, уже упомянутые в ответах выше:

И это, наверное, самый подробный комментарий в той статье. Это связано с пулом строк в Java и проблемами безопасности. Речь идет о том, как решить, что входит в пул строк. Предполагая, что обе строки равны, если их последовательность символов одинакова, тогда у нас есть условие гонки на то, кто попадет первым, а также проблемы безопасности. Если нет, то пул строк будет содержать избыточные строки, что приведет к потере преимущества его наличия. Просто прочти это для себя, а?

Расширение String нанесло бы ущерб равным и стажерам. JavaDoc говорит, что равно:

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

Или JVM может заблокировать эту дыру, убедившись, что в пул добавлены только конкретные объекты String (а не подклассы).

Источник

Русские Блоги

Почему String должен быть разработан как финал в Java?

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

Многие практические функции String, такие как «неизменность», являются произведениями искусства, разработанными инженерами! Работа хрупкая! Использование последних означает отказ от наследования, предотвращение разрушения мира детьми-медведями и поддержание мира во всем мире!

1. Что является неизменным?

Постоянство неизменности строк очень просто: как показано на следующем рисунке, присвоение существующей строки «abcd» для «abcedl» во второй раз не изменяет данные по первоначальному адресу памяти, но перенаправляет на новый объект и новый адрес.

Читайте также:  какой кислотой обработать ржавчину на автомобиле

2. Почему строка неизменна?

Откройте исходный код JDK,java.lang.StringПервые три строки начала класса написаны так:

/ ** String по сути является массивом символов и модифицируется с помощью ключевого слова final. * /

private final char value[];

Прежде всего, класс String имеет ключевое слово final, что означает, что String не может быть унаследован. Посмотрите на следующее, значение поля основного члена класса String представляет собой массив char [], и он используетсяfinalдекоративные. После создания последнего измененного поля его нельзя изменить.

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

Другими словами, переменная Array является просто ссылкой на стек, а структура онтологии массива находится в куче кучи. Значение в классе String изменяется на final, только неизменяемый ссылочный адрес, называемый value в стеке. Не сказано, что данные самого массива в куче неизменны. Посмотрите на этот пример,

value = another; // ошибка компилятора, окончательная неизменяемость

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

value [2] = 100; // В настоящее время массив уже

Или более грубое отражение может быть изменено напрямую.

Array.set (array, 2,100); // Массив также был изменен на

Строка неизменна,КлючПоскольку инженеры компании SUN позже применили все методы String, они не перемещали элементы в массиве и не открывали поля внутренних элементов.

3. Каковы преимущества неизменности?

Самая простая причина заключается вбезопасности

Пример 1

пакет _12_01 строка;

Открытый класс Почему String должен быть разработан как неизменяемый класс вы <

public static void main(String[] args) <

String processA = processA(a);

String processB = processB(b);

String processC = processC(c);

static String processA(String str)<

static String processB(String str)<

static String processC(String str)<

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

Если String является переменной, это может быть следующим образом, мы используем StringBuffer для имитации String является переменной

пакет _12_01 строка;

public class Why String должен быть задан как неизменяемый класс 2 <

public static void main(String[] args) <

StringBuffer a, b, c;

a = new StringBuffer(«test»);

String processA = processA(a);

String processB = processB(b);

String processC = processC(c);

static String processA(StringBuffer str)<

static String processB(StringBuffer str)<

static String processC(StringBuffer str)<

Можно видеть, что b = a, c = b, первоначальное намерение программиста состояло в том, что переменные не изменились. Так что неизменная безопасность String отражена здесь. Фактически, роль StringBuffer состоит в том, чтобы играть роль переменной, поддерживающей класс String.

Пример 2

Посмотрите на следующееHashSetС StringBuilder в качестве сценария элемента проблема является более серьезной и более тонкой.

public static void main(String[] args)<

HashSet hs=new HashSet ();

StringBuilder sb1=new StringBuilder(«aaa»);

StringBuilder sb2=new StringBuilder(«aaabbb»);

hs.add (sb2); // на этот раз в HashSet есть

sb3.append («bbb»); // на этот раз в HashSet есть

Переменные StringBuilder sb1 и sb2 указывают на литерал «aaa» и «aaabbb» в куче, соответственно. Вставьте их все в HashSet. Нет проблем на этом этапе. Но если позже я укажу переменную sb3 на адрес sb1, а затем изменит значение sb3, поскольку StringBuilder не имеет защиты от неизменности, sb3 будет напрямую изменен на адрес исходного «aaa». Значение sb1 также изменилось. В это время в HashSet появились два равных ключа «aaabbb».разрушенныйУникальность значения ключа HashSet, и такНикогда не используйте типы переменныхКлючи HashMap и HashSet.

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

Как всем известно, в параллельном сценарии одновременное чтение ресурса несколькими потоками не вызовет состояния гонки. Только запись в ресурсы опасна. Неизменяемые объекты не могут быть записаны, поэтому они являются потокобезопасными.

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

Не забывайStringдругойСтрунный константный пулИмущество. Строка как этаoneсtwoБуквально«something»Назначение. Они фактически указывают на один и тот же адрес памяти.

String one = «someString»;

String two = «someString»;

Интеллектуальная рекомендация

[Leetcode Tour] Array-697. Степень массива

Добавить расширение Redis для PHP7 под Windows

1 Просмотр информации о версии PHP Непосредственно используйте функцию phpinfo (), вывод в браузер в порядке Результаты вывода, в основном, отображают следующую информацию: версия PHP, архитектура, сб.

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

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

Том Зибель технические книги рекомендуется

iOS разработка программного обеспечения 1. Опытный в Objective-C [США] Кит Ли, Су Баолонг Народная почта и телекоммуникационная пресса Эта книга подходит для некоторых разработчиков, которые уже начал.

Источник

Сказочный портал