[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-java-core-rasskazhite-pro-privedenie-tipov-chto-takoe-ponizhenie-i-povyshenie-tipa":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":18,"progress":19,"seo":20},61,"rasskazhite-pro-privedenie-tipov-chto-takoe-ponizhenie-i-povyshenie-tipa",2,"java-core","Java Core","☕","Расскажите про приведение типов. Что такое понижение и повышение типа?","Java является строго типизированным языком программирования, а это означает, то что каждое выражение и каждая переменная имеет строго определенный тип уже на момент компиляции. Однако определен механизм приведения типов (casting) - способ преобразования значения переменной одного типа в значение другого типа.\n\nВ Java существуют несколько разновидностей приведения:\n\n+ **Тождественное (identity)**. Преобразование выражения любого типа к точно такому же типу всегда допустимо и происходит автоматически.\n+ **Расширение (повышение, upcasting) примитивного типа (widening primitive)**. Означает, что осуществляется переход от менее емкого типа к более ёмкому. Например, от типа `byte` (длина 1 байт) к типу `int` (длина 4 байта). Такие преобразование безопасны в том смысле, что новый тип всегда гарантировано вмещает в себя все данные, которые хранились в старом типе и таким образом не происходит потери данных. Этот тип приведения всегда допустим и происходит автоматически.\n+ **Сужение (понижение, downcasting) примитивного типа (narrowing primitive)**. Означает, что переход осуществляется от более емкого типа к менее емкому. При таком преобразовании есть риск потерять данные. Например, если число типа `int` было больше `127`, то при приведении его к `byte` значения битов старше восьмого будут потеряны. В Java такое преобразование должно совершаться явным образом, при этом все старшие биты, не умещающиеся в новом типе, просто отбрасываются - никакого округления или других действий для получения более корректного результата не производится.\n+ **Расширение объектного типа (widening reference)**. Означает неявное восходящее приведение типов или переход от более конкретного типа к менее конкретному, т.е. переход от потомка к предку. Разрешено всегда и происходит автоматически.\n+ **Сужение объектного типа (narrowing reference)**. Означает нисходящее приведение, то есть приведение от предка к потомку (подтипу). Возможно только если исходная переменная является подтипом приводимого типа. При несоответствии типов в момент выполнения выбрасывается исключение `ClassCastException`. Требует явного указания типа.\n+ **Преобразование к строке (to String)**. Любой тип может быть приведен к строке, т.е. к экземпляру класса `String`.\n+ **Запрещенные преобразования (forbidden)**. Не все приведения между произвольными типами допустимы. Например, к запрещенным преобразованиям относятся приведения от любого ссылочного типа к примитивному и наоборот (кроме преобразования к строке). Кроме того, невозможно привести друг к другу классы, находящиеся на разных ветвях дерева наследования и т.п.\n\nПри приведении ссылочных типов с самим объектом ничего не происходит, - меняется лишь тип ссылки, через которую происходит обращение к объекту.\n\nДля проверки возможности приведения нужно воспользоваться оператором `instanceof`:\n\n```java\nParent parent = new Child();\nif (parent instanceof Child) {\n    Child child = (Child) parent;\n}\n```","","junior",[15,16,17],"core","types","casting",[],null,{"title":21,"description":22,"ogTitle":21,"ogDescription":23,"keywords":24,"schemaAnswer":32,"featuredSnippetReady":33},"Приведение типов в Java: upcasting и downcasting — Gymterview","Что такое приведение типов в Java: повышение (upcasting) и понижение (downcasting), расширение и сужение примитивных и ссылочных типов с примерами.","Повышение типа (upcasting) происходит автоматически, понижение (downcasting) требует явного указания и может вызвать ClassCastException.",[25,17,26,27,28,29,30,31],"приведение типов","upcasting","downcasting","повышение типа","понижение типа","Java","типы данных","Приведение типов (casting) — преобразование значения одного типа в другой. Повышение (upcasting\u002Fwidening) — переход от более конкретного типа к менее конкретному, происходит автоматически и безопасно. Понижение (downcasting\u002Fnarrowing) — переход от менее конкретного к более конкретному, требует явного указания типа и может вызвать ClassCastException. Для примитивов расширение сохраняет данные, а сужение может привести к их потере.",true]