Идентификаторы, ключевые слова, операторы.

Структура Java программы.

Пример программы:

import java util.*;

public class HelloDate {

public static void main(String[ ] args)

{

System.out.print(“Здравствуй, сейчас- “);

System out println(new Date());

}

}

В начале каждого файла с программой должны пребывать директивы import, в которых перечисляются все дополнительные классы, нужные вашей программе. Существует целая библиотека классов, присоединяющаяся машинально к каждому файлу Java: java.lang. Так как пакет java.lang. машинально включается в каждую программу на Java, эти классы в любой момент доступны для применения. Имя класса сходится с именем файла. В то время, когда вы создаете отдельную программу, подобную данной, один из классов, обрисованных в файле, должен иметь совпадающее с ним наименование. (В случае, если это условие нарушено, компилятор скажет об неточности.) Одноименный класс обязан содержать способ с именем main() со следующей сигнатурой и возвращаемым типом: public static void main(String[] args) { Главное слово public обозначает, что способ доступен для внешнего мира. Доводом способа main() есть массив строчков. В данной программе массив args не употребляется, но компилятор Java настаивает на его присутствии, поскольку массив содержит параметры, переданные программе в командной строчке. Строчок, в которой распечатывается число, достаточно занимательна: System.out.println(new Date()): Довод является объектом Date, что создается только после этого, дабы передать собственный значение (машинально преобразуемое в String) способу println(). Когда команда будет выполнена, объект Date делается ненужным, сборщик мусора увидит это, и в итоге сам удалит его. Нам не требуется тревожиться о его удалении самим.

Идентификаторы, главные слова, операторы.

Идентификаторы

Имена переменных, классов, объектов, интерфейсов, способов именуются идентификаторами. Заглавия идентификаторов выбираются по следующим правилам:

• они должны начинаться с буквы либо знака подчеркивания;

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

• заглавия идентификаторов не должны совпадать с главными словами

Главные слова:

1) Главное слово static, делает элемент класса статическим. В то время, когда вы объявляете что-либо как static, это указывает, что эти либо способ не привязаны к определенному экземпляру этого класса. Исходя из этого, даже если вы ни при каких обстоятельствах не создавали объектов класса, вы имеете возможность привести к статическому методу либо получить доступ к статическим данным. С простым объектом вам нужно сперва создать его и применять для вызова способа либо доступа к информации, поскольку методы и нестатические данные должны совершенно верно знать объект, с которым трудятся.

2) Практически во всех процедурных языках поддерживаются стандартные команды управления, и во многих языках они совпадают. В Java к их числу относятся главные слова if-else, while, do-while, for, и команда выбора switch.

3) В теле любого из циклов вы имеете возможность руководить потоком программы, применяя особые главные слова break и continue. Команда break завершает цикл, наряду с этим оставшиеся операторы цикла не выполняются. Команда continue останавливает исполнение текущей итерации цикла и переходит к началу цикла, дабы начать исполнение нового шага.

4) Главные слова package и import разрешают разработчику библиотеки организовать логическое деление глобального пространства имен, предотвращающее конфликты имен.

5) Главные слова volatile и synchronized благодаря им задачи не мешают работе друг друга.

Операторы

Оператор приобретает один либо пара доводов и формирует на их базе новое значение. Форма передачи доводов пара другая, чем при вызове способа, но эффект тот же самый. Сложение (+), вычитание (-), умножение (*), деление (/) и присвоение (=) трудятся одинаково практически во всех языках программирования. Все операторы трудятся с операндами и выдают какой-то итог. Вдобавок кое-какие операторы смогут поменять значение операнда. Практически все операторы трудятся лишь с примитивами. Исключениями являются =, = = и !=, каковые смогут быть применены к объектам . Помимо этого, класс String поддерживает операции + и +=.

Управляющие конструкции.

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

В Java задействованы все управляющие конструкции языка С. Практически во всех процедурных языках поддерживаются стандартные команды управления, и во многих языках они совпадают. В Java к их числу относятся главные слова if-else, while, do-while, for, и команда выбора switch. Но в Java не поддерживается довольно часто осуждаемый оператор goto.

If-else

Команда if-else есть, возможно, самый распространенным методом передачи управления в программе. Условие должно дать итог типа boolean. В секции команд находится или несложная команда, завершенная точкой с запятой, или составная конструкция из команд, заключенная в фигурные скобки.

Конструкции while, do-while и for руководят циклами и время от времени именуются циклическими командами. Команда повторяется , пока управляющее логическое выражение не станет фальшивым. Логическое выражение вычисляется перед циклом (не считая do — while), а после этого любой раз перед исполнением очередного повторения оператора.

У главного слова return имеется два назначения: оно показывает, какое значение возвращается способом (в случае, если лишь он не типа void), и употребляется для немедленного выхода из способа.

Break и continue

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

Switch

Команду switch довольно часто именуют командой выбора. Посредством конструкции switch осуществляется выбор из нескольких альтернатив, в зависимости от значения целочисленного выражения. Команда switch сравнивает итог целочисленного выражения с каждым последующим целым-значением. В случае, если обнаруживается совпадение, исполняется соответствующая команда . В случае, если же совпадения не находится, исполняется команда по окончании главного слова default. Команда switch снабжает компактный синтаксис реализации множественного выбора (другими словами выбора из нескольких дорог исполнения программы), но для нее нужно управляющее выражение, результатом которого есть целочисленное значение, такое как int либо char. В случае, если, к примеру, критерием выбора есть строчок либо вещественное число, то команда switch не подойдет. Придется применять серию команд if-else.

определение и Объявление способов класса. Способы класса

  • Способ – это функция, обрисованная в класса
  • Совокупность способов определяет поведение класса
  • Описание способа включает тело и заголовок:

[модификаторы] тип имя(параметры) { тело; }

  • Тело – void printHello() { System.out.println(“hello”); }
  • Способ может принимать параметры и возвращать значение:

int square(int x) { return x*x; }

1. В случае, если способ возвращает значение несложного типа либо ссылку на объект, то его тип должен быть указан в заголовке способа.

2. Так же в теле способа обязан находиться хотя бы один оператор return(если не void)

3. В случае, если способ ничего не возвращает то в заголовке должен быть указан тип void

4. Оператор return срочно прекращает исполнение способа и возвращает управление вызывающему способу

5. Хороший стиль – применение одного оператора return в одном способе

6. Но JAVA не запрещает многократно применение return (при наличии соответствующих условий).

Вызовы конструкторов.

Конструктор инициализирует объект конкретно на протяжении создания. Имя конструктора сходится с именем класса, включая регистр, а по синтаксису конструктор похож на способ без возвращаемого значения. У нас имеется следующий класс:

class Box {

int width; // ширина коробки

int height; // высота коробки

int depth; // глубина коробки

// Конструктор

Box() {

width = 10;

height = 10;

depth = 10;

}

// вычисляем количество коробки

int getVolume() {

return width * height * depth;

}

}

Сейчас при записи Box b = new Box(); буден создан объект у которого ширина глубина и высота будут равны 10.
Вызов перегруженных конструкторов через this()

Имея дело с перегруженными конструкторами, комфортно один конструктор вызывать из другого через главное слово this. Вызов конструктора this() должен быть первым оператором в конструкторе. Разглядим пример пускай имеется класс с перегруженными конструкторами:

class Cat {

int age;

int birthday;

// Инициализируем переменные очевидно

Cat(int i, int j) {

age = i;

birthday = j;

}

// Инициализируем переменные одним и тем значением

Cat(int i) {

age = i;

birthday = i;

}

// Присвоим значения по умолчанию 0

Cat() {

age = 0;

birthday = 0;

}

}

Перепишем класс, применяя конструктор this().

class Cat{

int age;

int birthday;

// Инициализируем переменные очевидно

Cat(int i, int j) {

age = i;

birthday = j;

}

// Инициализируем переменные одним и тем значением

Cat(int i) {

this(i, i); // вызывается Cat(i, i);

}

// Присвоим значения по умолчанию 0

Cat() {

this(0); // вызывается Cat(0);

}

}

У нас сейчас лишь один конструктор, что присваивает значения полям — Cat(int, int). Что происходит при исполнении оператора:

Cat cat = new Cat(8);

Вызов конструктора Cat(8) ведет к исполнению конструктора this(8, 8), что равнозначно вызову конструктора Cat(8, 8).

Статические способы

У класса смогут быть статические способы, заявленные с модификатором static. К ним возможно обращаться не создавая объект. Мы уже встречали таковой способ — он именуется main. Такие способы не применяют данные о особенностях конкретных объектов класса — они обрабатывают неспециализированную для класса данные, хранящуюся в его статических полях. К примеру, в классе Person возможно статический способ, обрабатывающий эти из статического поля message. Вторым нередким случаем применения статических способов есть обстановка, в то время, когда класс предоставляет собственные сервисы объектам вторых классов. Таковым есть класс Math, что не имеет собственных полей — все его статические способы трудятся с объектами арифметических классов. Для обращения к статическим особенностям Вы показываете имя класса, имя и точку переменной. Для вызова статического способа нужно будет сделать что-то подобное. Серьёзным отличием статического способа от простого есть то, что в том месте не существует переменной this, т.е. обратиться к свойству класса, которое не есть статическим, нереально.

Пример статического способа

public static boolean isPrime(int n) {
for(int i = 2; i if(n%i == 0) {
return false;
}
}
return true;
}

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

Статические способы/свойства классов это такие способы/свойства, к каким возможно обратиться не создавая объект данного класса. К примеру, мы создаем описание стола. В этом случае, лишь в то время, когда мы создадим настоящий стол, мы сможем сказать о его высоте и ширине (с учетом погрешностей при производстве). Но вот материал вероятнее будет один на всех. Кроме этого один на всех будет чертеж, прочие атрибуты и название. Т.е. разумеется, что кое-какие свойства свойственны не конкретному объекту, а классу полностью. Для обращения к статическим особенностям Вы показываете имя класса, имя и точку переменной. В случае, если мы объявляем статическую переменную, это значит, что она одна на всех. Причем существует она кроме того тогда, в то время, когда нет ни одного экземпляра данного класса.

Пример класса со статическим особенностями

public class TestClass

{

private static Integer staticValue = 99;

public static void main(String[] arg) {

System.out.println(TestClass.staticValue);

}

}

Понятие интерфейса

Интерфейсы в Java во многом напоминают классы, но смогут содержать лишь константы, сигнатуры способов и положенные типы. В интерфейсах нет описания способов. Запрещено создать объект типа интерфейса — интерфейсы смогут лишь реализовываться некоторым классом либо наследоваться вторым интерфейсом. Объявление интерфейса весьма похоже на объявление класса. Сигнатуры способов объявляются без фигурных скобок и заканчиваются точкой с запятой. Для применения интерфейса вы должны написать класс, что будет реализовывать ваш интерфейс. Класс что реализует интерфейс, обязан обрисовывать все способы, заявленные в интерфейсе.

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

Объявление интерфейса содержит главное слово interface, имя интерфейса, перечень родительских интерфейсов через запятую (в случае, если имеется) и тело интерфейса. К примеру:

public interface GroupedInterface extends Interface1, Interface2, Interface3 {

// число e double E = 2.718282;

// сигнатуры способов void doSomething (int i, double x);

int doSomethingElse(String s);

}

Интерфейс может наследовать другие интерфейсы, как классы смогут наследовать второй

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

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

Понятие JVM

Java Virtual Machine — виртуальная машина Java. Виртуальная машина Java выполняет байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java (javac). JVM может кроме этого употребляться для исполнения программ, написанных на вторых языках программирования. К примеру, исходный код на языке Ada возможно откомпилирован в байт-код Java, что после этого может выполниться посредством JVM.

JVM есть главным компонентом платформы Java. Так как виртуальные автомобили Java доступны для многих программных платформ и аппаратных, Java может рассматриваться и как связующее ПО, и как независимая платформа. Применение одного байт-кода для многих платформ разрешает обрисовать Java как «скомпилировано в один раз, запускается везде» (compile once, run anywhere).

Понятие наследования.

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

Наследование есть одним из правил ООП, исходя из этого употребляется во всех ООП-языках, в том числе и в Java.

Синтаксис наследования

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

Расширение классов.

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

Пример
Имеется класс
class Point {

int х, у;

Point(int х, int у) {

this.x = х;

this. y = y;

}

}

Раширим класс Point

class Point3D extends Point {

int z;

Point3D(int x, int y, int z) {

super(x, y);

this.z = z; }

Point3D() {

this(-1,-1,-1);

} }

Реализация интерфейса.

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

Чтобы реализовать интерфейс употребляется главное слово implements:

public class имя_класса implements название_интерфейса {
}

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

Примитивные типы данных

В Java существует 8 примитивных типов данных:

Все числовые типы этого языка — знаковые.

  • byte (целые числа, 1 байт)
  • short (целые числа, 2 байта)
  • int (целые числа, 4 байта)
  • long (целые числа, 8 байтов)
  • float (вещественные числа, 4 байта) при инициализации переменной указывается буква f.
  • double (вещественные числа, 8 байтов)
  • char (знак Unicode, 2 байта)
  • boolean (значение истина/неправда, 1 байт)

Эти 8 типов являются основой для всех остальных типов данных. Примитивные типы владеют явным диапазоном допустимых значений.

char — символьный тип данных представляет собой один 16-битный Unicode знак.
Знаки char возможно задавать кроме этого при помощи соответствующих чисел. К примеру знак ‘Ы’ соответствует числу 1067. boolean — рекомендован для хранения логических значений. Переменные этого типа смогут принимать лишь одно из 2х вероятных значений true либо false.

Ссылочные типы данных.

В ссылочные типы входят все классы, интерфейсы, массивы. Тип String кроме этого относится к ссылочным типам данных.

Кроме этого существуют классы-оболочки:

  • Byte
  • Short
  • Integer
  • Long
  • Float
  • Double
  • Character
  • Boolean

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

Обработка исключений.

Обработка исключения возможно произведена посредством операторов try…catch, или передана внешней части программы.

Откомпилируем и запустим такую программу:

class Main {
public static void main(String[] args) {
int a = 4;
System.out.println(a/0);
}
}

В момент запуска мы заметим сообщение откуда понимаем, что класс произошедшего исключения — ArithmeticException. Это исключение возможно обработать:

class Main {
public static void main(String[] args) {
int a = 4;
try {
System.out.println(a/0);
} catch (ArithmeticException e) {
System.out.println(Случилась недопустимая арифметическая операция);
}
}
}

Сейчас вместо стандартного сообщения об неточности будет выполняться блок catch, параметром которого есть объект e соответствующего исключению класса. В блок try наряду с этим помещается тот фрагмент программы, где возможно может появиться исключение.

Одному try может соответствовать сходу пара блоков catch с различными классами исключений.

Для того, что бы поймать какое то исключение, без указания правильного исключения мы можем добавить обработчик для класса Exception, потому, что данный класс родительский для всех остальных контролируемых исключений, то он будет перехватывать каждые из них. Потому, что исключения выстроены на иерархии классов и подклассов, то сперва нужно пробовать обработать более частные исключения и только после этого более неспециализированные. Другими словами поставив первым блок с обработкой исключения класса Exception, а по окончании него блоки с обработкой более частных исключений будет выполняться блок с обработкой исключения класса Exceprtion и остальные выполняться не будут. Необязательным добавлением к блокам try…catch возможно блок finally. Помещенные в него команды будут выполняться в любом случае, независимо от того, случилось ли исключение либо нет.

Примеры Классов Java IO API

— InputStream / OutputStream

— Reader / Writer

— InputStreamReader / OutputStreamWriter

— BufferedInputStream / BufferedOutputStream

— BufferedReader / BufferedWriter

Процесс чтения данных из ресурса и запись их в назначенное место продемонстрирован на рисунку ниже.

Идентификаторы, ключевые слова, операторы.

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

Идентификаторы, ключевые слова, операторы.

Структура Java программы.

Пример программы:

import java util.*;

public class HelloDate {

public static void main(String[ ] args)

{

System.out.print(“Здравствуй, сейчас- “);

System out println(new Date());

}

}

В начале каждого файла с программой должны пребывать директивы import, в которых перечисляются все дополнительные классы, нужные вашей программе. Существует целая библиотека классов, присоединяющаяся машинально к каждому файлу Java: java.lang. Так как пакет java.lang. машинально включается в каждую программу на Java, эти классы в любой момент доступны для применения. Имя класса сходится с именем файла. В то время, когда вы создаете отдельную программу, подобную данной, один из классов, обрисованных в файле, должен иметь совпадающее с ним наименование. (В случае, если это условие нарушено, компилятор скажет об неточности.) Одноименный класс обязан содержать способ с именем main() со следующей сигнатурой и возвращаемым типом: public static void main(String[] args) { Главное слово public обозначает, что способ доступен для внешнего мира. Доводом способа main() есть массив строчков. В данной программе массив args не употребляется, но компилятор Java настаивает на его присутствии, поскольку массив содержит параметры, переданные программе в командной строчке. Строчок, в которой распечатывается число, достаточно увлекательна: System.out.println(new Date()): Довод является объектом Date, что создается только после этого, дабы передать собственный значение (машинально преобразуемое в String) способу println(). Когда команда будет выполнена, объект Date делается ненужным, сборщик мусора увидит это, и в итоге сам удалит его. Нам не требуется тревожиться о его удалении самим.

Идентификаторы, главные слова, операторы.

Идентификаторы

Имена переменных, классов, объектов, интерфейсов, способов именуются идентификаторами. Заглавия идентификаторов выбираются по следующим правилам:

• они должны начинаться с буквы либо знака подчеркивания;

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

• заглавия идентификаторов не должны совпадать с главными словами

Главные слова:

1) Главное слово static, делает элемент класса статическим. В то время, когда вы объявляете что-либо как static, это указывает, что эти либо способ не привязаны к определенному экземпляру этого класса. Исходя из этого, даже если вы ни при каких обстоятельствах не создавали объектов класса, вы имеете возможность привести к статическому методу либо получить доступ к статическим данным. С простым объектом вам нужно сперва создать его и применять для вызова способа либо доступа к информации, поскольку методы и нестатические данные должны совершенно верно знать объект, с которым трудятся.

2) Практически во всех процедурных языках поддерживаются стандартные команды управления, и во многих языках они совпадают. В Java к их числу относятся главные слова if-else, while, do-while, for, и команда выбора switch.

3) В теле любого из циклов вы имеете возможность руководить потоком программы, применяя особые главные слова break и continue. Команда break завершает цикл, наряду с этим оставшиеся операторы цикла не выполняются. Команда continue останавливает исполнение текущей итерации цикла и переходит к началу цикла, дабы начать исполнение нового шага.

4) Главные слова package и import разрешают разработчику библиотеки организовать логическое деление глобального пространства имен, предотвращающее конфликты имен.

5) Главные слова volatile и synchronized благодаря им задачи не мешают работе друг друга.

Операторы

Оператор приобретает один либо пара доводов и формирует на их базе новое значение. Форма передачи доводов пара другая, чем при вызове способа, но эффект тот же самый. Сложение (+), вычитание (-), умножение (*), деление (/) и присвоение (=) трудятся одинаково практически во всех языках программирования. Все операторы трудятся с операндами и выдают какой-то итог. Вдобавок кое-какие операторы смогут поменять значение операнда. Практически все операторы трудятся лишь с примитивами. Исключениями являются =, = = и !=, каковые смогут быть применены к объектам . Помимо этого, класс String поддерживает операции + и +=.

Управляющие конструкции.

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

В Java задействованы все управляющие конструкции языка С. Практически во всех процедурных языках поддерживаются стандартные команды управления, и во многих языках они совпадают. В Java к их числу относятся главные слова if-else, while, do-while, for, и команда выбора switch. Но в Java не поддерживается довольно часто осуждаемый оператор goto.

If-else

Команда if-else есть, возможно, самый распространенным методом передачи управления в программе. Условие должно дать итог типа boolean. В секции команд находится или несложная команда, завершенная точкой с запятой, или составная конструкция из команд, заключенная в фигурные скобки.

Конструкции while, do-while и for руководят циклами и время от времени именуются циклическими командами. Команда повторяется , пока управляющее логическое выражение не станет фальшивым. Логическое выражение вычисляется перед циклом (не считая do — while), а после этого любой раз перед исполнением очередного повторения оператора.

У главного слова return имеется два назначения: оно показывает, какое значение возвращается способом (в случае, если лишь он не типа void), и употребляется для немедленного выхода из способа.

Break и continue

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

Switch

Команду switch довольно часто именуют командой выбора. Посредством конструкции switch осуществляется выбор из нескольких альтернатив, в зависимости от значения целочисленного выражения. Команда switch сравнивает итог целочисленного выражения с каждым последующим целым-значением. В случае, если обнаруживается совпадение, исполняется соответствующая команда . В случае, если же совпадения не находится, исполняется команда по окончании главного слова default. Команда switch снабжает компактный синтаксис реализации множественного выбора (другими словами выбора из нескольких дорог исполнения программы), но для нее нужно управляющее выражение, результатом которого есть целочисленное значение, такое как int либо char. В случае, если, к примеру, критерием выбора есть строчок либо вещественное число, то команда switch не подойдет. Придется применять серию команд if-else.

ЗАКАВЫЧИТЬ МОМЕНТАЛЬНО ВСЕ КЛЮЧЕВЫЕ СЛОВА ЯНДЕКС ДИРЕКТ!


Интересные записи:

Понравилась статья? Поделиться с друзьями: