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 вместе с ним.

Метод Finalize

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

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

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

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

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

Источник

Все о ключевых словах static и final

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

Что такое ключевое слово static?

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

Где можно употреблять ключевое слово static?

Мы можем использовать это ключевое слово в четырех контекстах:

Рассмотрим подробнее каждый из перечисленных пунктов.

Статические методы

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

Статические переменные

При создании объектов класса в Java каждый из них содержит собственную копию всех переменных класса.

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

В приведенном выше примере normalVariable — переменная класса, а staticVariable — статическая переменная. Если вы объявите переменную, как показано ниже:

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

Здесь статические переменные — переменные уровня класса. Поэтому, если вы обращаетесь к статическим переменным через переменную экземпляра объекта, то это отражается на соответствующей статической переменной уровня класса. Таким образом, статические переменные всегда имеют одно и то же значение. Но переменная экземпляра сохраняет отдельное значение в каждом экземпляре объекта. Таким образом, приведенный выше фрагмент кода выведет:

Статические переменные — редкость в Java. Вместо них применяют статические константы. Они определяются ключевым словом static final и представлены в верхнем регистре. Вот почему некоторые предпочитают использовать верхний регистр и для статических переменных.

Статические блоки

Здесь мы видим статический блок с синтаксисом:

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

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

Вывод приведенного выше фрагмента кода выглядит следующим образом, потому что переменная staticVariable обновлена вторым значением статического блока.

Вложенный статический класс

В Java можно объявить класс внутри другого класса. Такие классы называются вложенными классами. Они бывают двух типов: статические и нестатические.

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

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

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

В приведенном выше примере видно, что внутренний класс MyInnerClass может получить доступ ко всем методам и переменным внешнего, включая приватные переменные. Статическому внутреннему классу, напротив, недоступны какие-либо методы или переменные внешнего класса.

Где в памяти Java хранятся статические классы и переменные?

Вплоть до 8-й версии Java статические методы и переменные хранились в пространстве permgen. Но потом было введено новое пространство памяти, называемое метапространством — в нем хранятся все эти имена и поля класса, методы класса с байт-кодом методов, пул констант, JIT-оптимизации и т. д. Причина удаления permgen в Java 8.0 в том, что очень сложно предсказать необходимый размер permgen.

Зачем нужно ключевое слово final?

Что такое конечная переменная и когда ей стоит воспользоваться?

Существует три способа инициализации конечной переменной.

Когда следует применять конечную переменную

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

Где использовать конечные классы

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

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

Когда использовать конечные методы

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

final string 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.

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

если вы видите 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 (а не подклассы).

Источник

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

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