[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-java-core-chem-otlichayutsya-final-finally-i-finalize":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},60,"chem-otlichayutsya-final-finally-i-finalize",2,"java-core","Java Core","☕","Чем отличаются `final`, `finally` и `finalize()`?","Модификатор `final`:\n\n+ Класс не может иметь наследников;\n+ Метод не может быть переопределен в классах наследниках;\n+ Поле не может изменить свое значение после инициализации;\n+ Локальные переменные не могут быть изменены после присвоения им значения;\n+ Параметры методов не могут изменять своё значение внутри метода.\n\nОператор `finally` гарантирует, что определенный в нём участок кода будет выполнен независимо от того, какие исключения были возбуждены и перехвачены в блоке `try-catch`.\n\nМетод `finalize()` вызывается перед тем как сборщик мусора будет проводить удаление объекта.\n\nПример:\n```java\n\npublic class MainClass {\n\n\tpublic static void main(String args[]) {\n\t\tTestClass a = new TestClass();\n\t\tSystem.out.println(\"result of a.a() is \" + a.a());\n\t\ta = null;\n\t\tSystem.gc(); \u002F\u002F Принудительно зовём сборщик мусора\n\t\ta = new TestClass();\n\t\tSystem.out.println(\"result of a.a() is \" + a.a());\n\t\tSystem.out.println(\"!!! done\");\n\t}\n\n}\n```\n\n```java\npublic class TestClass {\n\n\tpublic int a() {\n\t\ttry {\n\t\t\tSystem.out.println(\"!!! a() called\");\n\t\t\tthrow new Exception(\"\");\n\t\t} catch (Exception e) {\n\t\t\tSystem.out.println(\"!!! Exception in a()\");\n\t\t\treturn 2;\n\t\t} finally {\n\t\t\tSystem.out.println(\"!!! finally in a() \");\n\t\t}\n\t}\n\n\t@Override\n\tprotected void finalize() throws Throwable {\n\t\tSystem.out.println(\"!!! finalize() called\");\n\t\tsuper.finalize();\n\t}\n}\n```\n\nРезультат выполнения:\n\n```\n!!! a() called\n!!! Exception in a()\n!!! finally in a()\nresult of a.a() is 2\n!!! a() called\n!!! Exception in a()\n!!! finally in a()\n!!! finalize() called\nresult of a.a() is 2\n!!! done\n```","","junior",[15,16,17,18],"core","garbage-collection","keywords","exceptions",[],null,{"title":22,"description":23,"ogTitle":22,"ogDescription":24,"keywords":25,"schemaAnswer":34,"featuredSnippetReady":35},"Разница между final, finally и finalize() в Java — Gymterview","Чем отличаются ключевое слово final, блок finally и метод finalize() в Java. Подробное сравнение с примерами кода для собеседования.","final — модификатор неизменности, finally — гарантированный блок кода, finalize() — метод очистки перед сборкой мусора.",[26,27,28,29,30,31,32,33],"final","finally","finalize","Java","модификатор","исключения","сборщик мусора","собеседование","Модификатор final запрещает наследование класса, переопределение метода и изменение значения поля\u002Fпеременной. Оператор finally гарантирует выполнение блока кода независимо от исключений в try-catch. Метод finalize() вызывается сборщиком мусора перед удалением объекта для выполнения действий по очистке ресурсов.",true]