Что такое позднее и раннее связывание java

Java: механизмы наследования, ссылочные типы данных, интерфейсы, вложенные классы

Механизмы наследования

Интерфейс может быть объявлен для расширения одного или нескольких интерфейсов.

Наследование позволяет определять новые классы в терминах существующих классов.

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

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

Объявление класса

Объявление класса вводит новый ссылочный тип и определяет или часть, или всю его реализацию.

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

Вложенный класс описывается так же, как и внешний.

В описании каждого класса указывается имя класса и тело класса, содержащее объявления полей класса. Дополнительно для класса могут быть заданы модификаторы класса и указан непосредственный суперкласс и реализуемые классом интерфейсы. Полями класса в Java называются переменные и методы, определяемые в теле класса.

Класс может иметь более одного модификатора класса.

В языке программирования Java существуют следующие модификаторы класса:

Для указания модификаторов класса применяются следующие правила:

Раннее и позднее связывание

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

Источник

Java: механизмы наследования, ссылочные типы данных, интерфейсы, вложенные классы

Механизмы наследования

Интерфейс может быть объявлен для расширения одного или нескольких интерфейсов.

Наследование позволяет определять новые классы в терминах существующих классов.

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

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

Объявление класса

Объявление класса вводит новый ссылочный тип и определяет или часть, или всю его реализацию.

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

Вложенный класс описывается так же, как и внешний.

В описании каждого класса указывается имя класса и тело класса, содержащее объявления полей класса. Дополнительно для класса могут быть заданы модификаторы класса и указан непосредственный суперкласс и реализуемые классом интерфейсы. Полями класса в Java называются переменные и методы, определяемые в теле класса.

Класс может иметь более одного модификатора класса.

В языке программирования Java существуют следующие модификаторы класса:

Для указания модификаторов класса применяются следующие правила:

Раннее и позднее связывание

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

Источник

Java: механизмы наследования, ссылочные типы данных, интерфейсы, вложенные классы

Механизмы наследования

Интерфейс может быть объявлен для расширения одного или нескольких интерфейсов.

Наследование позволяет определять новые классы в терминах существующих классов.

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

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

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

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

Объявление класса

Объявление класса вводит новый ссылочный тип и определяет или часть или всю его реализацию.

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

Вложенный класс описывается так же, как и внешний.

В описании каждого класса указывается имя класса и тело класса, содержащее объявления полей класса. Дополнительно для класса могут быть заданы модификаторы класса и указан непосредственный суперкласс и реализуемые классом интерфейсы. Полями класса в Java называются переменные и методы, определяемые в теле класса.

Класс может иметь более одного модификатора класса.

В языке программирования Java существуют следующие модификаторы класса:

Для указания модификаторов класса применяются следующие правила:

Раннее и позднее связывание

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

Источник

Что такое позднее и раннее связывание java

Основы Объектно-Ориентированного Программирования (ООП)

ООП — это одна из парадигм (методологий, подходов) программирования, основанная на принципах, предполагающих написание программного кода в виде классов и их объектов, взаимодействующих друг с другом.

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

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

Объектно-ориентированным программированием люди занимались аж с конца 60-ых годов, когда вышел язык Simula. В то время ООП не вызвало никакой революции и не доминировало среди программистов. До наступления 90-ых годов. Почему именно тогда? Революция произошла в основном потому, что возникла нужда в еще более сложных программах, которые решали еще более сложные задачи и использовали все больше и больше ресурсов процессора и памяти. Для экономичной, надежной и предсказуемой разработки крупных программ сильные стороны ООП – абстракции и модульность – оказались очень кстати.

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

Весь мир мыслит объектами. Мы сидим на стульях, пьем кофе из чашек, ездим на машинах и тд. Все мы существуем в мире объектов и живем среди них. Да и мы сами являемся объектом.

Следует понимать, что ООП нужно программисту, чтобы контролировать сложность разработки. А не для только для того, чтобы всегда и везде «отражать объекты реального мира», как это пишут в книгах для начинающих.

Какие парадигмы программирования вы знаете?

императивная (англ. imperative — приказ), когда программа состоит из последовательности инструкций (машина Тьюринга, машинный код, язык ассемблера и тд), которые говорят, как(!) необходимо решить поставленную задачу;

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

Эта парадигма имеет подвиды:

в соответствии с данной методологией любая программа строится без использования оператора goto из трёх базовых управляющих структур: следование, ветвление, цикл; кроме того, используются подпрограммы.

особенность таких языков программирования состоит в том, что задачи разбиваются на шаги (процедуры, подпрограммы) и решаются шаг за шагом.

декларативная — это когда программа описывает то, что мы хотим получить (а не как!), а язык уже сам разбирается, как этого достичь (SQL, HTML, элементы функционального программирования в Java).

Эта парадигма имеет подвиды:

в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании).

лямбда-исчисления являются основой для функционального программирования.

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

Первым функциональным языком был Лисп

Класс — это составной (ссылочный) тип данных, являющийся прототипом (blueprint, шаблоном, моделью) объекта из какой-либо предметной области (сферы деятельности человека, но не обязательно), описывающий его состояние и реализующий его поведение.

Также можно сказать, что класс — это образец по которому будет создан объект. Это «чертеж» будущих объектов.

Объект — это экземпляр какого-либо класса (расположенного в памяти), отражающий конкретную сущность программируемой предметной области (не всегда!), и обладающий внутренним состоянием в виде полей / атрибутов (fields) и поведением (функционалом) в виде методов (methods).

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

Объекты являются строительными блоками объектно-ориентированного программирования. Любая программа, написанная в ООП стиле является по сути контейнером объектов из которых она состоит.

Термин объект в программном обеспечении впервые был введен в языке Simula-67 и применялся для моделирования реальности. Но в полной мере ОО парадигма была полностью реализована в языке Smalltalk-80

Что такое инстанциирование?

Инстанцирование (англ. instantiation) — создание экземпляра класса.

Что такое инициализация объекта?

Инициализация (англ. initialization) — присвоение начальных значений полям объекта.

Что такое время жизни объекта?

Время жизни объекта — время с момента создания объекта (с помощью конструктора) и до его уничтожения (с помощью garbage collector).

Какими характеристиками обладают объекты?

Объекты имеют состояние и поведение.

Что такое состояние объекта?

Состояние объекта (state) — это значения, которые принимают его поля (fields). Со сменой значения полей — меняется состояние объекта.

Что такое поведение объекта?

Поведение объекта (behavior) — это набор его методов (methods), которые могут изменять состояние объекта либо выполнять иные функции.

Назовите основные принципы ООП?

Раньше этих принципов было три: инкапсуляция, наследование, полиморфизм. Потом появился четвертый принцип — абстракция.

Что такое абстракция?

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

Абстракция (лат. abstractio — отвлечение) — некое обобщение как результат абстрагирования.

Абстрагирование — это процесс «необращения внимания» (отбрасывания лишнего) на несущественные свойства изучаемого предмета, на данном уровне абстракции, и выделения нужных.

Уровень абстракции — это степень отвлеченности (условие, ситуация), подразумевающее, что на данном этапе какие-то свойства (признаки) объекта необходимо выделить, а какие-то проигнорировать.

Что такое позднее и раннее связывание java. Смотреть фото Что такое позднее и раннее связывание java. Смотреть картинку Что такое позднее и раннее связывание java. Картинка про Что такое позднее и раннее связывание java. Фото Что такое позднее и раннее связывание java

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

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

Что такое инкапсуляция?

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

Что такое позднее и раннее связывание java. Смотреть фото Что такое позднее и раннее связывание java. Смотреть картинку Что такое позднее и раннее связывание java. Картинка про Что такое позднее и раннее связывание java. Фото Что такое позднее и раннее связывание java

Для реализации этого механизма защиты в Java существуют специальные синтаксические конструкции (модификаторы доступа), явно задающие область видимости каждого поля и метода класса: private, protected, package, public.

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

Что такое позднее и раннее связывание java. Смотреть фото Что такое позднее и раннее связывание java. Смотреть картинку Что такое позднее и раннее связывание java. Картинка про Что такое позднее и раннее связывание java. Фото Что такое позднее и раннее связывание java

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

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

Что такое позднее и раннее связывание java. Смотреть фото Что такое позднее и раннее связывание java. Смотреть картинку Что такое позднее и раннее связывание java. Картинка про Что такое позднее и раннее связывание java. Фото Что такое позднее и раннее связывание java

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

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

Достоинства:

сокрытие реализации позволяет сократить временные затраты на поиск ошибок: если мы контролируем доступ к атрибуту, то при возникновении проблемы нам не придется беспокоиться об отслеживании каждого фрагмента кода, который мог бы изменить значение соответствующего атрибута — оно может быть изменено только в одном месте (с помощью сеттера);

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

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

Недостатки:

Что такое наследование?

Наследование (англ. inheritance) — принцип, позволяющий создавать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью.

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

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

Что такое позднее и раннее связывание java. Смотреть фото Что такое позднее и раннее связывание java. Смотреть картинку Что такое позднее и раннее связывание java. Картинка про Что такое позднее и раннее связывание java. Фото Что такое позднее и раннее связывание java

Для обозначения наследования в Java служит слово extends.

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

Чем дальше вверх по иерархии наследования, тем более универсальными и абстрактными становятся классы. Такие классы становятся основой для других классов. И, как правило, запрещается создавать их экземпляры.

В Java есть два вида наследования:

Порядок инициализации объектов при наследовании

память, выделенная под новый объект, заполняется двоичными нулями;

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

инициализируются поля класса в порядке их записи;

вызывается тело конструктора нужного объекта.

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

Ограничения

при наследовании доступ из методов класса-потомка к приватным полям родительского класса напрямую запрещен. Кроме того, данные поля не наследуются. Но благодаря специальным публичным методам, которые называются get/геттеры и set/сеттеры можно совершенно свободно обращаться к данным полям родительского класса из класса-потомка;

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

Достоинства

способствует уменьшению повторяемости кода, т.е. имеет место быть его переиспользование (англ. code reuse);

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

Недостатки

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

при внесении изменений в базовые классы — классы наследники об этом могут ничего не знать;

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

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

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

Когда нужно применять наследование

Для того что бы определить стоит ли применять наследование нужно для предка и предполагаемого производного класса попробовать установить отношение «является» («is a»).

Отношение «является» служит признаком наследования.

Наследование применяют для описания объектов, незначительно отличающихся друг от друга

При наследовании в классе-потомке должна добавляться функциональность, отличающаяся от существующей в классе-предке. Если в наследнике часть функциональности убирается, то это является поводом задуматься о необходимости в данной ситуации наследования.

Что такое полиморфизм?

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

Что такое позднее и раннее связывание java. Смотреть фото Что такое позднее и раннее связывание java. Смотреть картинку Что такое позднее и раннее связывание java. Картинка про Что такое позднее и раннее связывание java. Фото Что такое позднее и раннее связывание java

Это способность функции обрабатывать данные разных типов.

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

Данный механизм называется — динамическим связыванием или поздним связыванием, или связыванием во время выполнения (а не во время компиляции!).

Ограничения

Достоинства

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

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

Недостатки

Что такое связывание?

Связывание (binding) — присоединение вызова метода к телу метода. (непонятное определение. )

Что такое раннее связывание?

Раннее связывание (early binding) — это связывание, происходящее во время компиляции. Также его называют статическим.

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

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

Что такое позднее связывание?

Позднее связывание (late binding) — это связывание, которое выполняется во время выполнения программы. Его также называют динамическим (dynamic) или связыванием на стадии выполнения (runtime binding). При позднем связывании определяется фактический тип объекта для вызова именно его метода.

Ограничение

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

Пример:

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

s.draw(); — будет вызван метод не базового класса (Shape), а предка (Circle) благодаря позднему связыванию и полиморфизму.

Что такое восходящее преобразование типов

Восходящее преобразование (upcasting) — это когда, например метод в качестве параметра типа базового класса принимает тип класса наследника. Но это разумно, т.к. класс наследник является разновидностью класса предка. Данный факт позволяет преобразовывать ссылку на объект наследника в ссылку на объект предка.

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

Преобразования можно делать и в обратном порядке — это называется нисходящее преобразование (downcasting).

Типы отношений между классами

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

Если один объект состоит из других объектов (поля класса имеют ссылочный тип), которые создаются внутри этого объекта-контейнера и при этом время жизни «частей» зависит от времени жизни целого (умирает контейнер — погибают и его составляющий), то это называется композицией.

Но если после смерти объекта-контейнера его части остаются жить (не удаляются GC, тк на них ссылаются в другом месте программы), то это уже агрегация.

Если еще проще, то вся разница между агрегацией и композицией состоит в том, каким образом инициализируются поля в классе-контейнере и как эта инициализация влияет на время их жизни после смерти основного класса.

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

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

Что такое агрегация?

Агрегация (aggregation; «has-a» — есть, имеет, содержит) применяется когда один класс должен быть контейнером для других классов. Причем время существования содержащихся в нем классов (полей) никак не зависит от времени существования класса контейнера.

Агрегация — отношение «часть-целое» между двумя равноправными объектами, когда один объект (контейнер) имеет ссылку на другой объект. Оба объекта могут существовать независимо: если контейнер будет уничтожен, то его содержимое — нет.

Данный вид связи на UML-диаграмме обозначается в виде линии с незакрашенным ромбиком (ромбик всегда находится со стороны целого, а простая линия со стороны составной части).

Что такое позднее и раннее связывание java. Смотреть фото Что такое позднее и раннее связывание java. Смотреть картинку Что такое позднее и раннее связывание java. Картинка про Что такое позднее и раннее связывание java. Фото Что такое позднее и раннее связывание java

Что такое композиция?

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

Данный вид связи на UML-диаграмме обозначается в виде линии с закрашенным ромбиком (ромбик всегда находится со стороны целого, а простая линия со стороны составной части).

Разница между агрегацией и композицией

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

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

Пример этих видов связи из реального мира

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

Композицию часто предпочитают наследованию

Достоинства

В чем преимущество ООП?

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

уменьшение сложности программного обеспечения;

повышение надежности программного обеспечения;

обеспечение возможности модификации отдельных компонентов программного обеспечения без изменения остальных его компонентов;

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

Какие есть недостатки у ООП?

Дополнительная информация:

Источник

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

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