0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#База знаний</a></p>
1
<p><a>#База знаний</a></p>
2
<ul><li>14 май 2021</li>
2
<ul><li>14 май 2021</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Java - объектно-ориентированный язык, а значит, программы состоят из объектов и классов. Разбираемся, что это такое.</p>
4
</ul><p>Java - объектно-ориентированный язык, а значит, программы состоят из объектов и классов. Разбираемся, что это такое.</p>
5
<p>Java-разработчик, преподаёт в Skillbox, осваивает машинное обучение.</p>
5
<p>Java-разработчик, преподаёт в Skillbox, осваивает машинное обучение.</p>
6
<p>Если в коде программы на объектно-ориентированном языке нужно отразить сущность каких-то объектов, используется понятие класса.</p>
6
<p>Если в коде программы на объектно-ориентированном языке нужно отразить сущность каких-то объектов, используется понятие класса.</p>
7
<p>Возьмём пример из реального мира. У многих, вероятно, есть кошка, собака или хомячок, а у кого-то могут быть даже коровы, гуси, овцы. Любое из этих существ (объектов) можно охарактеризовать словами "домашнее животное" и у каждого есть свой набор атрибутов: вес, кличка, свой тип (корова, гусь, овца, собака и так далее). А ещё они, очевидно, могут есть и передвигаться.</p>
7
<p>Возьмём пример из реального мира. У многих, вероятно, есть кошка, собака или хомячок, а у кого-то могут быть даже коровы, гуси, овцы. Любое из этих существ (объектов) можно охарактеризовать словами "домашнее животное" и у каждого есть свой набор атрибутов: вес, кличка, свой тип (корова, гусь, овца, собака и так далее). А ещё они, очевидно, могут есть и передвигаться.</p>
8
<p>Класс - это шаблонная конструкция, которая позволяет описать в программе объект, его свойства (атрибуты или поля класса) и поведение (методы класса).</p>
8
<p>Класс - это шаблонная конструкция, которая позволяет описать в программе объект, его свойства (атрибуты или поля класса) и поведение (методы класса).</p>
9
<p>Каждый класс имеет своё имя, чтобы в будущем к нему можно было обратиться. Чтобы создать класс на Java, необходимо написать слово<strong>class</strong>, дать ему название и поставить фигурные скобки:</p>
9
<p>Каждый класс имеет своё имя, чтобы в будущем к нему можно было обратиться. Чтобы создать класс на Java, необходимо написать слово<strong>class</strong>, дать ему название и поставить фигурные скобки:</p>
10
<p>Имя класса в нашем примере -<strong>Pet</strong>.</p>
10
<p>Имя класса в нашем примере -<strong>Pet</strong>.</p>
11
<p>Мы можем создавать поля класса, каждое из которых имеет свой тип.</p>
11
<p>Мы можем создавать поля класса, каждое из которых имеет свой тип.</p>
12
<p>Поле класса - это переменная, которая описывает какое-либо из свойств данного класса.</p>
12
<p>Поле класса - это переменная, которая описывает какое-либо из свойств данного класса.</p>
13
<p>Для наших домашних питомцев и полями класса будут вес, кличка и принадлежность к определённому типу (коровы, гуси, собаки и так далее). Очевидно, что здесь вес - это числовая переменная, а кличка и тип - строки символов. Тогда мы можем написать:</p>
13
<p>Для наших домашних питомцев и полями класса будут вес, кличка и принадлежность к определённому типу (коровы, гуси, собаки и так далее). Очевидно, что здесь вес - это числовая переменная, а кличка и тип - строки символов. Тогда мы можем написать:</p>
14
class Pet { int weight; String name; String type; }<p>Переменные<strong>weight</strong>,<strong>name</strong>и <strong>type</strong> - поля нашего класса<strong>Pet</strong>, то есть свойства, которые описывают объект этого класса. Таких полей может быть сколько угодно, каждое имеет свой тип, как обычная переменная.</p>
14
class Pet { int weight; String name; String type; }<p>Переменные<strong>weight</strong>,<strong>name</strong>и <strong>type</strong> - поля нашего класса<strong>Pet</strong>, то есть свойства, которые описывают объект этого класса. Таких полей может быть сколько угодно, каждое имеет свой тип, как обычная переменная.</p>
15
<p>Мы уже пару раз упомянули словосочетание "объект класса". Так говорят, потому что любой объект является экземпляром какого-либо класса. Здесь действует простая аналогия: класс - это как бы чертёж, который описывает объект, его устройство, а объект - реализация чертежа, его материальное воплощение.</p>
15
<p>Мы уже пару раз упомянули словосочетание "объект класса". Так говорят, потому что любой объект является экземпляром какого-либо класса. Здесь действует простая аналогия: класс - это как бы чертёж, который описывает объект, его устройство, а объект - реализация чертежа, его материальное воплощение.</p>
16
<p>Давайте запрограммируем первый объект класса<strong>Pet</strong>. Пусть это будет кот (<strong>type</strong>) с кличкой (<strong>name</strong>) Барсик и весом (<strong>weight</strong>) 10 (измерение в килограммах).</p>
16
<p>Давайте запрограммируем первый объект класса<strong>Pet</strong>. Пусть это будет кот (<strong>type</strong>) с кличкой (<strong>name</strong>) Барсик и весом (<strong>weight</strong>) 10 (измерение в килограммах).</p>
17
<p>Сперва необходимо создать переменную типа<strong>Pet</strong>:</p>
17
<p>Сперва необходимо создать переменную типа<strong>Pet</strong>:</p>
18
<p>Наш объект<strong>pet</strong>выглядит как обычная переменная, но в качестве типа указан класс<strong>Pet</strong>, и в данный момент в нём ничего нет. Инициализируем объект - воспользуемся такой синтаксической конструкцией:</p>
18
<p>Наш объект<strong>pet</strong>выглядит как обычная переменная, но в качестве типа указан класс<strong>Pet</strong>, и в данный момент в нём ничего нет. Инициализируем объект - воспользуемся такой синтаксической конструкцией:</p>
19
<p>Мы ставим знак равно, пишем ключевое слово<strong>new</strong>, имя нашего класса и круглые скобки. Принято говорить, что здесь мы вызываем конструктор класса<strong>Pet</strong>. Пока просто запомним это - о конструкторах и о том, как их использовать, будет рассказано в отдельной статье.</p>
19
<p>Мы ставим знак равно, пишем ключевое слово<strong>new</strong>, имя нашего класса и круглые скобки. Принято говорить, что здесь мы вызываем конструктор класса<strong>Pet</strong>. Пока просто запомним это - о конструкторах и о том, как их использовать, будет рассказано в отдельной статье.</p>
20
<p>Теперь у нас появилась переменная<strong>pet</strong>типа<strong>Pet</strong>, в которой содержится объект класса<strong>Pet</strong>. Ранее в этом классе мы объявили поля, к которым можно обратиться и занести в них значения.</p>
20
<p>Теперь у нас появилась переменная<strong>pet</strong>типа<strong>Pet</strong>, в которой содержится объект класса<strong>Pet</strong>. Ранее в этом классе мы объявили поля, к которым можно обратиться и занести в них значения.</p>
21
<p>Чтобы получить доступ к какому-либо полю нашего класса<strong>Pet</strong>, нужно специальным образом обратиться к переменной<strong>pet</strong> - поставить точку и вызвать необходимое поле. Например, вот так:</p>
21
<p>Чтобы получить доступ к какому-либо полю нашего класса<strong>Pet</strong>, нужно специальным образом обратиться к переменной<strong>pet</strong> - поставить точку и вызвать необходимое поле. Например, вот так:</p>
22
Pet pet = new Pet(); pet.type = "Кот"; pet.name = "Барсик"; pet.weight = 10;<p>Теперь во всех трёх полях есть по значению, а мы можем получить их из программы, если потребуется, - например, распечатать в консоль:</p>
22
Pet pet = new Pet(); pet.type = "Кот"; pet.name = "Барсик"; pet.weight = 10;<p>Теперь во всех трёх полях есть по значению, а мы можем получить их из программы, если потребуется, - например, распечатать в консоль:</p>
23
Pet pet = new Pet(); pet.type = "Кот"; pet.name = "Барсик"; pet.weight = 10; System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight); --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 10<p>Изменить значение в любом из полей класса также несложно. Пусть наш кот Барсик слегка потолстеет - добавим к его весу 1 кг:</p>
23
Pet pet = new Pet(); pet.type = "Кот"; pet.name = "Барсик"; pet.weight = 10; System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight); --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 10<p>Изменить значение в любом из полей класса также несложно. Пусть наш кот Барсик слегка потолстеет - добавим к его весу 1 кг:</p>
24
Pet pet = new Pet(); pet.type = "Кот"; pet.name = "Барсик"; pet.weight = 10; System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight); pet.weight = pet.weight + 1; System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight); --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 10 --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 11<p>Как видим, мы просто изменили вес в поле<strong>weight</strong>, а при выводе получили уже другое значение.</p>
24
Pet pet = new Pet(); pet.type = "Кот"; pet.name = "Барсик"; pet.weight = 10; System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight); pet.weight = pet.weight + 1; System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight); --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 10 --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 11<p>Как видим, мы просто изменили вес в поле<strong>weight</strong>, а при выводе получили уже другое значение.</p>
25
<p>В начале статьи я упомянул, что наши домашние животные могут перемещаться и есть. В отличие от параметров вроде веса и клички, это уже не свойства объекта, а его функции. В классе эти функции обозначают как методы.</p>
25
<p>В начале статьи я упомянул, что наши домашние животные могут перемещаться и есть. В отличие от параметров вроде веса и клички, это уже не свойства объекта, а его функции. В классе эти функции обозначают как методы.</p>
26
<p>Метод класса - это блок кода, состоящий из ряда инструкций, который можно вызывать по его имени. Он обязательно содержит возвращаемый тип, название, аргументы и тело метода.</p>
26
<p>Метод класса - это блок кода, состоящий из ряда инструкций, который можно вызывать по его имени. Он обязательно содержит возвращаемый тип, название, аргументы и тело метода.</p>
27
<p>Синтаксис метода в Java:</p>
27
<p>Синтаксис метода в Java:</p>
28
возвращаемыйТип названиеМетода(аргументы) { //code return значение; }<p>Строка<strong>возвращаемыйТип</strong>показывает, какого типа данные вернёт метод. Например, если в качестве возвращаемого типа мы поставим тип<strong>String</strong>, то метод должен будет вернуть строку, а если<strong>int</strong> - целое число.</p>
28
возвращаемыйТип названиеМетода(аргументы) { //code return значение; }<p>Строка<strong>возвращаемыйТип</strong>показывает, какого типа данные вернёт метод. Например, если в качестве возвращаемого типа мы поставим тип<strong>String</strong>, то метод должен будет вернуть строку, а если<strong>int</strong> - целое число.</p>
29
<p>Чтобы вернуть значение из метода, используется специальное слово<strong>return</strong>. Если мы хотим, чтобы метод ничего не возвращал, то вместо возвращаемого типа нужно использовать специальное слово<strong>void</strong>.</p>
29
<p>Чтобы вернуть значение из метода, используется специальное слово<strong>return</strong>. Если мы хотим, чтобы метод ничего не возвращал, то вместо возвращаемого типа нужно использовать специальное слово<strong>void</strong>.</p>
30
<p><strong>Аргументы</strong> - то, что нужно передать в метод при его вызове. Мы можем указать сколько угодно параметров через запятую либо не указывать ни одного.</p>
30
<p><strong>Аргументы</strong> - то, что нужно передать в метод при его вызове. Мы можем указать сколько угодно параметров через запятую либо не указывать ни одного.</p>
31
<p>Для примера напишем простейший метод с именем<strong>sum</strong>(пока что не в нашем классе Pet), который складывает два переданных числа и возвращает их результат:</p>
31
<p>Для примера напишем простейший метод с именем<strong>sum</strong>(пока что не в нашем классе Pet), который складывает два переданных числа и возвращает их результат:</p>
32
int sum(int a, int b) { int c = a + b; return c; }<p>Возвращаемый тип метода<strong>int</strong>, он указан перед именем<strong>sum</strong>. Далее идут два аргумента<strong>a</strong>и <strong>b</strong>, у обоих также указан тип<strong>int</strong>. Важно помнить, что возвращаемый тип и тип переменных не обязательно должны совпадать.</p>
32
int sum(int a, int b) { int c = a + b; return c; }<p>Возвращаемый тип метода<strong>int</strong>, он указан перед именем<strong>sum</strong>. Далее идут два аргумента<strong>a</strong>и <strong>b</strong>, у обоих также указан тип<strong>int</strong>. Важно помнить, что возвращаемый тип и тип переменных не обязательно должны совпадать.</p>
33
<p>Аргументы метода работают как обычные переменные - за пределами метода к ним никак нельзя получить доступ. Внутри метода мы складываем значения из переменных<strong>a</strong>и <strong>b</strong>, записываем полученное значение в переменную<strong>c</strong>. После этого мы возвращаем значение переменной<strong>c</strong> - только оно доступно вне метода.</p>
33
<p>Аргументы метода работают как обычные переменные - за пределами метода к ним никак нельзя получить доступ. Внутри метода мы складываем значения из переменных<strong>a</strong>и <strong>b</strong>, записываем полученное значение в переменную<strong>c</strong>. После этого мы возвращаем значение переменной<strong>c</strong> - только оно доступно вне метода.</p>
34
<p>Вот пример:</p>
34
<p>Вот пример:</p>
35
nt d = sum(1, 2); System.out.println(d); --OUTPUT> 3<p>Мы передали в метод<strong>sum</strong>два значения 1 и 2, а на выходе получили результат их сложения 3. Также можно создать метод, который принимает значение типа<strong>String</strong>, а возвращает длину этой строки:</p>
35
nt d = sum(1, 2); System.out.println(d); --OUTPUT> 3<p>Мы передали в метод<strong>sum</strong>два значения 1 и 2, а на выходе получили результат их сложения 3. Также можно создать метод, который принимает значение типа<strong>String</strong>, а возвращает длину этой строки:</p>
36
int lengthOfString(String str) { return str.length(); }<p>В этом случае у нас возвращаемый типа<strong>int</strong>, а параметр<strong>str</strong> - типа<strong>String</strong>.</p>
36
int lengthOfString(String str) { return str.length(); }<p>В этом случае у нас возвращаемый типа<strong>int</strong>, а параметр<strong>str</strong> - типа<strong>String</strong>.</p>
37
<p>Попробуем использовать этот метод:</p>
37
<p>Попробуем использовать этот метод:</p>
38
String t = "Any field"; int d = lengthOfString(t); System.out.println(d); --OUTPUT> 9<p>Также мы можем создать метод, который ничего не возвращает, а просто печатает переданное слово в консоль:</p>
38
String t = "Any field"; int d = lengthOfString(t); System.out.println(d); --OUTPUT> 9<p>Также мы можем создать метод, который ничего не возвращает, а просто печатает переданное слово в консоль:</p>
39
void printString(String str) { System.out.println(str); }<p>Либо метод, который ничего не принимает на вход, а просто печатает "Привет!":</p>
39
void printString(String str) { System.out.println(str); }<p>Либо метод, который ничего не принимает на вход, а просто печатает "Привет!":</p>
40
void sayHello() { System.out.println("Привет!"); }<p>В методах, которые ничего не возвращают, слово<strong>return</strong>можно опустить.</p>
40
void sayHello() { System.out.println("Привет!"); }<p>В методах, которые ничего не возвращают, слово<strong>return</strong>можно опустить.</p>
41
<p>Обратите внимание, что<strong>return</strong>полностью прекращает выполнение метода:</p>
41
<p>Обратите внимание, что<strong>return</strong>полностью прекращает выполнение метода:</p>
42
void printIfMoreFive(int num) { if (num <= 5) { return; } System.out.println("Привет"); }<p>Теперь попробуем вызвать этот метод, передав в него число 3:</p>
42
void printIfMoreFive(int num) { if (num <= 5) { return; } System.out.println("Привет"); }<p>Теперь попробуем вызвать этот метод, передав в него число 3:</p>
43
printIfMoreFive(3); --OUTPUT><p>В этом случае мы ничего не увидим в консоли, так как 3 меньше 5, а значит, отработает блок<strong>if</strong>и произойдёт выход из метода с помощью слова<strong>return</strong>.</p>
43
printIfMoreFive(3); --OUTPUT><p>В этом случае мы ничего не увидим в консоли, так как 3 меньше 5, а значит, отработает блок<strong>if</strong>и произойдёт выход из метода с помощью слова<strong>return</strong>.</p>
44
<p>Но если передадим 6, увидим нашу надпись "Привет!":</p>
44
<p>Но если передадим 6, увидим нашу надпись "Привет!":</p>
45
printIfMoreFive(6); --OUTPUT> Привет!<p>Теперь, когда мы разобрались, что такое методы, давайте создадим два метода - <strong>eat</strong>и <strong>run</strong> - в классе<strong>Pet</strong>.</p>
45
printIfMoreFive(6); --OUTPUT> Привет!<p>Теперь, когда мы разобрались, что такое методы, давайте создадим два метода - <strong>eat</strong>и <strong>run</strong> - в классе<strong>Pet</strong>.</p>
46
<p>Пусть первый из них принимает на вход параметр типа<strong>int</strong>и увеличивает на это значение поле<strong>weight</strong>(сколько скушал питомец, на столько и потолстел). А после этого печатает в консоль "Я поел" и возвращает новый вес.</p>
46
<p>Пусть первый из них принимает на вход параметр типа<strong>int</strong>и увеличивает на это значение поле<strong>weight</strong>(сколько скушал питомец, на столько и потолстел). А после этого печатает в консоль "Я поел" и возвращает новый вес.</p>
47
<p>Второй из методов<strong>run</strong>пусть уменьшает вес на 1, но только если он больше 5, и печатает в консоль: "Я бегу". Иначе, если вес меньше или равен 5: "Я не могу бежать".</p>
47
<p>Второй из методов<strong>run</strong>пусть уменьшает вес на 1, но только если он больше 5, и печатает в консоль: "Я бегу". Иначе, если вес меньше или равен 5: "Я не могу бежать".</p>
48
class Pet { int weight; String name; String type; int eat(int amount) { weight += amount; System.out.println("Я поел"); return weight; } void run() { if (weight <= 5) { System.out.println("Я не могу бежать"); return; } weight--; System.out.println("Я бегу"); } }<p>Теперь мы можем вызвать эти методы у объектов класса<strong>Pet</strong>. Чтобы это сделать, нужно обратиться к объекту, поставить точку и таким способом вызвать необходимый метод.</p>
48
class Pet { int weight; String name; String type; int eat(int amount) { weight += amount; System.out.println("Я поел"); return weight; } void run() { if (weight <= 5) { System.out.println("Я не могу бежать"); return; } weight--; System.out.println("Я бегу"); } }<p>Теперь мы можем вызвать эти методы у объектов класса<strong>Pet</strong>. Чтобы это сделать, нужно обратиться к объекту, поставить точку и таким способом вызвать необходимый метод.</p>
49
Pet pet = new Pet(); pet.type = "Кот"; pet.name = "Барсик"; pet.weight = 10; System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight); System.out.println("Кот поел и теперь весит " + pet.eat(2) + " кг"); for (int i = 0; i < 8; i++) { pet.run(); } System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight); --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 10 --OUTPUT> Я поел --OUTPUT> Кот поел и теперь весит 12 кг --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я не могу бежать --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 5<p>Иногда в каком-то методе требуется создать параметр, у которого имя совпадает с именем поля класса. В таких случаях, чтобы обратиться внутри метода именно к полю класса, а не к параметру нашего метода, используется ключевое слово<strong>this</strong>.</p>
49
Pet pet = new Pet(); pet.type = "Кот"; pet.name = "Барсик"; pet.weight = 10; System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight); System.out.println("Кот поел и теперь весит " + pet.eat(2) + " кг"); for (int i = 0; i < 8; i++) { pet.run(); } System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight); --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 10 --OUTPUT> Я поел --OUTPUT> Кот поел и теперь весит 12 кг --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я бегу --OUTPUT> Я не могу бежать --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 5<p>Иногда в каком-то методе требуется создать параметр, у которого имя совпадает с именем поля класса. В таких случаях, чтобы обратиться внутри метода именно к полю класса, а не к параметру нашего метода, используется ключевое слово<strong>this</strong>.</p>
50
<p>Для иллюстрации этого создадим метод,<strong>setName</strong>, который будет устанавливать переданное значение в поле<strong>name</strong>, а затем сообщать в консоль, что нашего питомца теперь зовут по-другому.</p>
50
<p>Для иллюстрации этого создадим метод,<strong>setName</strong>, который будет устанавливать переданное значение в поле<strong>name</strong>, а затем сообщать в консоль, что нашего питомца теперь зовут по-другому.</p>
51
class Pet { int weight; String name; String type; int eat(int amount) { weight += amount; System.out.println("Я поел"); return weight; } void run() { if (weight <= 5) { System.out.println("Я не могу бежать"); return; } weight--; System.out.println("Я бегу"); } void setName(String name) { this.name = name; System.out.println("Теперь это домашнее животное зовут " + this.name); } }<p>В результате с помощью<strong>this.name</strong>мы обращаемся к полю<strong>name</strong>и заносим в него значение из параметра метода<strong>name</strong>.</p>
51
class Pet { int weight; String name; String type; int eat(int amount) { weight += amount; System.out.println("Я поел"); return weight; } void run() { if (weight <= 5) { System.out.println("Я не могу бежать"); return; } weight--; System.out.println("Я бегу"); } void setName(String name) { this.name = name; System.out.println("Теперь это домашнее животное зовут " + this.name); } }<p>В результате с помощью<strong>this.name</strong>мы обращаемся к полю<strong>name</strong>и заносим в него значение из параметра метода<strong>name</strong>.</p>
52
<p>Также мы можем вызывать один метод вслед за другим. Давайте сделаем так, чтобы метод<strong>eat</strong>возвращал текущее животное с помощью<strong>this</strong>.</p>
52
<p>Также мы можем вызывать один метод вслед за другим. Давайте сделаем так, чтобы метод<strong>eat</strong>возвращал текущее животное с помощью<strong>this</strong>.</p>
53
class Pet { int weight; String name; String type; int amountOfFood; Pet eat(int amount) { weight += amount; System.out.println("Я поел"); amountOfFood += amount; return this; } void run() { if (weight <= 5) { System.out.println("Я не могу бежать"); return; } weight--; System.out.println("Я бегу"); } }<p>Теперь мы можем написать так:</p>
53
class Pet { int weight; String name; String type; int amountOfFood; Pet eat(int amount) { weight += amount; System.out.println("Я поел"); amountOfFood += amount; return this; } void run() { if (weight <= 5) { System.out.println("Я не могу бежать"); return; } weight--; System.out.println("Я бегу"); } }<p>Теперь мы можем написать так:</p>
54
Pet pet = new Pet(); pet.eat(1).eat(1).run();<p>Здесь мы дважды вызываем метод<strong>eat</strong>у одного и того же объекта класса (кота), а следом за ним вызываем метод<strong>run</strong>. И все эти вызовы делаются последовательно в одной строке, через точку.</p>
54
Pet pet = new Pet(); pet.eat(1).eat(1).run();<p>Здесь мы дважды вызываем метод<strong>eat</strong>у одного и того же объекта класса (кота), а следом за ним вызываем метод<strong>run</strong>. И все эти вызовы делаются последовательно в одной строке, через точку.</p>
55
<p>С помощью специального слова<strong>static</strong>мы можем создать статические поля и методы. Эти поля и методы описывают уже не объект класса, а сам класс. То есть они вызываются по имени класса, а их значение - общее для всех объектов данного класса.</p>
55
<p>С помощью специального слова<strong>static</strong>мы можем создать статические поля и методы. Эти поля и методы описывают уже не объект класса, а сам класс. То есть они вызываются по имени класса, а их значение - общее для всех объектов данного класса.</p>
56
<p>Например, мы хотим посчитать, сколько еды съели все домашние животные. Введём поле<strong>amountOfAllFood</strong>типа<strong>int</strong>и добавим к нему слово<strong>static</strong>. А также введём нестатическое поле<strong>amountOfFood</strong>. Изменять данные поля мы будем в методе<strong>eat</strong>.</p>
56
<p>Например, мы хотим посчитать, сколько еды съели все домашние животные. Введём поле<strong>amountOfAllFood</strong>типа<strong>int</strong>и добавим к нему слово<strong>static</strong>. А также введём нестатическое поле<strong>amountOfFood</strong>. Изменять данные поля мы будем в методе<strong>eat</strong>.</p>
57
class Pet { int weight; String name; String type; int amountOfFood; static int amountOfAllFood; int eat(int amount) { weight += amount; System.out.println("Я поел"); amountOfFood += amount; amountOfAllFood += amount; return weight; } void run() { if (weight <= 5) { System.out.println("Я не могу бежать"); return; } weight--; System.out.println("Я бегу"); } void setName(String name) { this.name = name; System.out.println("Теперь это домашнее животное зовут " + this.name); } }<p>Теперь попробуем создать двух животных, и пусть каждое из них поест.</p>
57
class Pet { int weight; String name; String type; int amountOfFood; static int amountOfAllFood; int eat(int amount) { weight += amount; System.out.println("Я поел"); amountOfFood += amount; amountOfAllFood += amount; return weight; } void run() { if (weight <= 5) { System.out.println("Я не могу бежать"); return; } weight--; System.out.println("Я бегу"); } void setName(String name) { this.name = name; System.out.println("Теперь это домашнее животное зовут " + this.name); } }<p>Теперь попробуем создать двух животных, и пусть каждое из них поест.</p>
58
Pet cat = new Pet(); cat.type = "Кот"; cat.name = "Барсик"; cat.weight = 10; System.out.println( "Домашнее животное: " + cat.type + "\nКличка: " + cat.name + "\nВес: " + cat.weight + "\nСколько животное съело: " + cat.amountOfFood); Pet dog = new Pet(); dog.type = "Собака"; dog.name = "Тузик"; dog.weight = 15; System.out.println( "Домашнее животное: " + dog.type + "\nКличка: " + dog.name + "\nВес: " + dog.weight + "\nСколько животное съело: " + dog.amountOfFood); System.out.println("Общее количество съеденной еды: " + Pet.amountOfAllFood); cat.eat(4); dog.eat(6); System.out.println( "Домашнее животное: " + cat.type + "\nКличка: " + cat.name + "\nВес: " + cat.weight + "\nСколько животное съело: " + cat.amountOfFood); System.out.println( "Домашнее животное: " + dog.type + "\nКличка: " + dog.name + "\nВес: " + dog.weight + "\nСколько животное съело: " + dog.amountOfFood); System.out.println("Общее количество съеденной еды: " + Pet.amountOfAllFood); --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 10 --OUTPUT> Сколько животное съело: 0 --OUTPUT> Домашнее животное: Собака --OUTPUT> Кличка: Тузик --OUTPUT> Вес: 15 --OUTPUT> Сколько животное съело: 0 --OUTPUT> Общее количество съеденной еды: 0 --OUTPUT> Я поел --OUTPUT> Я поел --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 14 --OUTPUT> Сколько животное съело: 4 --OUTPUT> Домашнее животное: Собака --OUTPUT> Кличка: Тузик --OUTPUT> Вес: 21 --OUTPUT> Сколько животное съело: 6 --OUTPUT> Общее количество съеденной еды: 10<p>Как видите, к полю<strong>amountOfAllFood</strong>мы обращаемся уже не через объект, а по имени класса, и в этом поле хранится общее количество съеденной еды. Зато в поле<strong>amountOfFood</strong>у каждого животного - именно своё количество съеденной еды.</p>
58
Pet cat = new Pet(); cat.type = "Кот"; cat.name = "Барсик"; cat.weight = 10; System.out.println( "Домашнее животное: " + cat.type + "\nКличка: " + cat.name + "\nВес: " + cat.weight + "\nСколько животное съело: " + cat.amountOfFood); Pet dog = new Pet(); dog.type = "Собака"; dog.name = "Тузик"; dog.weight = 15; System.out.println( "Домашнее животное: " + dog.type + "\nКличка: " + dog.name + "\nВес: " + dog.weight + "\nСколько животное съело: " + dog.amountOfFood); System.out.println("Общее количество съеденной еды: " + Pet.amountOfAllFood); cat.eat(4); dog.eat(6); System.out.println( "Домашнее животное: " + cat.type + "\nКличка: " + cat.name + "\nВес: " + cat.weight + "\nСколько животное съело: " + cat.amountOfFood); System.out.println( "Домашнее животное: " + dog.type + "\nКличка: " + dog.name + "\nВес: " + dog.weight + "\nСколько животное съело: " + dog.amountOfFood); System.out.println("Общее количество съеденной еды: " + Pet.amountOfAllFood); --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 10 --OUTPUT> Сколько животное съело: 0 --OUTPUT> Домашнее животное: Собака --OUTPUT> Кличка: Тузик --OUTPUT> Вес: 15 --OUTPUT> Сколько животное съело: 0 --OUTPUT> Общее количество съеденной еды: 0 --OUTPUT> Я поел --OUTPUT> Я поел --OUTPUT> Домашнее животное: Кот --OUTPUT> Кличка: Барсик --OUTPUT> Вес: 14 --OUTPUT> Сколько животное съело: 4 --OUTPUT> Домашнее животное: Собака --OUTPUT> Кличка: Тузик --OUTPUT> Вес: 21 --OUTPUT> Сколько животное съело: 6 --OUTPUT> Общее количество съеденной еды: 10<p>Как видите, к полю<strong>amountOfAllFood</strong>мы обращаемся уже не через объект, а по имени класса, и в этом поле хранится общее количество съеденной еды. Зато в поле<strong>amountOfFood</strong>у каждого животного - именно своё количество съеденной еды.</p>
59
<p>Мы можем обратиться к полю<strong>amountOfAllFood</strong>и через объект - результат будет тот же. Но принято обращаться именно через имя класса:</p>
59
<p>Мы можем обратиться к полю<strong>amountOfAllFood</strong>и через объект - результат будет тот же. Но принято обращаться именно через имя класса:</p>
60
Pet cat = new Pet(); cat.type = "Кот"; cat.name = "Барсик"; cat.weight = 10; System.out.println( "Домашнее животное: " + cat.type + "\nКличка: " + cat.name + "\nВес: " + cat.weight + "\nСколько животное съело: " + cat.amountOfFood); Pet dog = new Pet(); dog.type = "Собака"; dog.name = "Тузик"; dog.weight = 15; System.out.println( "Домашнее животное: " + dog.type + "\nКличка: " + dog.name + "\nВес: " + dog.weight + "\nСколько животное съело: " + dog.amountOfFood); System.out.println("Общее количество съеденной еды: " + cat.amountOfAllFood); cat.eat(4); dog.eat(6); System.out.println( "Домашнее животное: " + cat.type + "\nКличка: " + cat.name + "\nВес: " + cat.weight + "\nСколько животное съело: " + cat.amountOfFood); System.out.println( "Домашнее животное: " + dog.type + "\nКличка: " + dog.name + "\nВес: " + dog.weight + "\nСколько животное съело: " + dog.amountOfFood); System.out.println("Общее количество съеденной еды: " + dog.amountOfAllFood);<p>Как вы могли заметить, в нашем примере постоянно дублируется код с выводом информации об объекте. Давайте вынесем его в отдельный метод в классе<strong>Pet</strong>:</p>
60
Pet cat = new Pet(); cat.type = "Кот"; cat.name = "Барсик"; cat.weight = 10; System.out.println( "Домашнее животное: " + cat.type + "\nКличка: " + cat.name + "\nВес: " + cat.weight + "\nСколько животное съело: " + cat.amountOfFood); Pet dog = new Pet(); dog.type = "Собака"; dog.name = "Тузик"; dog.weight = 15; System.out.println( "Домашнее животное: " + dog.type + "\nКличка: " + dog.name + "\nВес: " + dog.weight + "\nСколько животное съело: " + dog.amountOfFood); System.out.println("Общее количество съеденной еды: " + cat.amountOfAllFood); cat.eat(4); dog.eat(6); System.out.println( "Домашнее животное: " + cat.type + "\nКличка: " + cat.name + "\nВес: " + cat.weight + "\nСколько животное съело: " + cat.amountOfFood); System.out.println( "Домашнее животное: " + dog.type + "\nКличка: " + dog.name + "\nВес: " + dog.weight + "\nСколько животное съело: " + dog.amountOfFood); System.out.println("Общее количество съеденной еды: " + dog.amountOfAllFood);<p>Как вы могли заметить, в нашем примере постоянно дублируется код с выводом информации об объекте. Давайте вынесем его в отдельный метод в классе<strong>Pet</strong>:</p>
61
class Pet { int weight; String name; String type; int amountOfFood; static int amountOfAllFood; int eat(int amount) { weight += amount; System.out.println("Я поел"); amountOfFood += amount; amountOfAllFood += amount; return weight; } void run() { if (weight <= 5) { System.out.println("Я не могу бежать"); return; } weight--; System.out.println("Я бегу"); } void setName(String name) { this.name = name; System.out.println("Теперь это домашнее животное зовут " + this.name); } void printInfo() { System.out.println( "Домашнее животное: " + type + "\nКличка: " + name + "\nВес: " + weight + "\nСколько животное съело: " + amountOfFood); } }<p>Теперь нам достаточно лишь обратиться к методу<strong>printInfo</strong>через объект, о котором мы хотим получить информацию.</p>
61
class Pet { int weight; String name; String type; int amountOfFood; static int amountOfAllFood; int eat(int amount) { weight += amount; System.out.println("Я поел"); amountOfFood += amount; amountOfAllFood += amount; return weight; } void run() { if (weight <= 5) { System.out.println("Я не могу бежать"); return; } weight--; System.out.println("Я бегу"); } void setName(String name) { this.name = name; System.out.println("Теперь это домашнее животное зовут " + this.name); } void printInfo() { System.out.println( "Домашнее животное: " + type + "\nКличка: " + name + "\nВес: " + weight + "\nСколько животное съело: " + amountOfFood); } }<p>Теперь нам достаточно лишь обратиться к методу<strong>printInfo</strong>через объект, о котором мы хотим получить информацию.</p>
62
Pet cat = new Pet(); cat.type = "Кот"; cat.name = "Барсик"; cat.weight = 10; cat.printInfo();<p>Но у нас есть ещё строка с выводом общего количества еды. Можем ли мы поместить её в метод<strong>printInfo</strong>? Да, оказывается, можем:</p>
62
Pet cat = new Pet(); cat.type = "Кот"; cat.name = "Барсик"; cat.weight = 10; cat.printInfo();<p>Но у нас есть ещё строка с выводом общего количества еды. Можем ли мы поместить её в метод<strong>printInfo</strong>? Да, оказывается, можем:</p>
63
class Pet { int weight; String name; String type; int amountOfFood; static int amountOfAllFood; int eat(int amount) { weight += amount; System.out.println("Я поел"); amountOfFood += amount; amountOfAllFood += amount; return weight; } void run() { if (weight <= 5) { System.out.println("Я не могу бежать"); return; } weight--; System.out.println("Я бегу"); } void setName(String name) { this.name = name; System.out.println("Теперь это домашнее животное зовут " + this.name); } void printInfo() { System.out.println( "Домашнее животное: " + type + "\nКличка: " + name + "\nВес: " + weight + "\nСколько животное съело: " + amountOfFood); System.out.println("Общее количество съеденной еды: " + amountOfAllFood); } }<p>Всё хорошо, но теперь при каждом вызове<strong>printInfo</strong>у нас будет печататься информация об общем количестве еды. Чтобы этого избежать, лучше вынести строку в отдельный статический метод:</p>
63
class Pet { int weight; String name; String type; int amountOfFood; static int amountOfAllFood; int eat(int amount) { weight += amount; System.out.println("Я поел"); amountOfFood += amount; amountOfAllFood += amount; return weight; } void run() { if (weight <= 5) { System.out.println("Я не могу бежать"); return; } weight--; System.out.println("Я бегу"); } void setName(String name) { this.name = name; System.out.println("Теперь это домашнее животное зовут " + this.name); } void printInfo() { System.out.println( "Домашнее животное: " + type + "\nКличка: " + name + "\nВес: " + weight + "\nСколько животное съело: " + amountOfFood); System.out.println("Общее количество съеденной еды: " + amountOfAllFood); } }<p>Всё хорошо, но теперь при каждом вызове<strong>printInfo</strong>у нас будет печататься информация об общем количестве еды. Чтобы этого избежать, лучше вынести строку в отдельный статический метод:</p>
64
class Pet { int weight; String name; String type; int amountOfFood; static int amountOfAllFood; int eat(int amount) { weight += amount; System.out.println("Я поел"); amountOfFood += amount; amountOfAllFood += amount; return weight; } void run() { if (weight <= 5) { System.out.println("Я не могу бежать"); return; } weight--; System.out.println("Я бегу"); } void setName(String name) { this.name = name; System.out.println("Теперь это домашнее животное зовут " + this.name); } void printInfo() { System.out.println( "Домашнее животное: " + type + "\nКличка: " + name + "\nВес: " + weight + "\nСколько животное съело: " + amountOfFood); } static void printStaticInfo() { System.out.println("Общее количество съеденной еды: " + amountOfAllFood); } }<p>У статического метода<strong>printStaticInfo</strong>также нет никаких отличий от обычного метода, но он относится к классу, а не к объекту данного класса. Вызываем его через обращение к классу:</p>
64
class Pet { int weight; String name; String type; int amountOfFood; static int amountOfAllFood; int eat(int amount) { weight += amount; System.out.println("Я поел"); amountOfFood += amount; amountOfAllFood += amount; return weight; } void run() { if (weight <= 5) { System.out.println("Я не могу бежать"); return; } weight--; System.out.println("Я бегу"); } void setName(String name) { this.name = name; System.out.println("Теперь это домашнее животное зовут " + this.name); } void printInfo() { System.out.println( "Домашнее животное: " + type + "\nКличка: " + name + "\nВес: " + weight + "\nСколько животное съело: " + amountOfFood); } static void printStaticInfo() { System.out.println("Общее количество съеденной еды: " + amountOfAllFood); } }<p>У статического метода<strong>printStaticInfo</strong>также нет никаких отличий от обычного метода, но он относится к классу, а не к объекту данного класса. Вызываем его через обращение к классу:</p>
65
Pet cat = new Pet(); cat.type = "Кот"; cat.name = "Барсик"; cat.weight = 10; cat.printInfo(); Pet dog = new Pet(); dog.type = "Собака"; dog.name = "Тузик"; dog.weight = 15; dog.printInfo(); Pet.printStaticInfo(); cat.eat(4); dog.eat(6); cat.printInfo(); dog.printInfo(); Pet.printStaticInfo();<p>Важно заметить, что из метода<strong>printStaticInfo</strong>мы можем обратиться только к статическим полям. Это происходит потому, что нестатические поля существуют в рамках конкретного объекта класса, а статический метод - в рамках всего класса.</p>
65
Pet cat = new Pet(); cat.type = "Кот"; cat.name = "Барсик"; cat.weight = 10; cat.printInfo(); Pet dog = new Pet(); dog.type = "Собака"; dog.name = "Тузик"; dog.weight = 15; dog.printInfo(); Pet.printStaticInfo(); cat.eat(4); dog.eat(6); cat.printInfo(); dog.printInfo(); Pet.printStaticInfo();<p>Важно заметить, что из метода<strong>printStaticInfo</strong>мы можем обратиться только к статическим полям. Это происходит потому, что нестатические поля существуют в рамках конкретного объекта класса, а статический метод - в рамках всего класса.</p>
66
<p>Но можно добавить параметр типа<strong>Pet</strong>в данный метод - тогда у этого параметра мы будем вызывать необходимые поля. Например, так:</p>
66
<p>Но можно добавить параметр типа<strong>Pet</strong>в данный метод - тогда у этого параметра мы будем вызывать необходимые поля. Например, так:</p>
67
static void printStaticInfo(Pet pet) { System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight + "\nСколько животное съело: " + pet.amountOfFood); System.out.println("Общее количество съеденной еды: " + amountOfAllFood); }Pet cat = new Pet(); cat.type = "Кот"; cat.name = "Барсик"; cat.weight = 10; Pet dog = new Pet(); dog.type = "Собака"; dog.name = "Тузик"; dog.weight = 15; Pet.printStaticInfo(cat); Pet.printStaticInfo(dog); cat.eat(4); dog.eat(6); Pet.printStaticInfo(cat); Pet.printStaticInfo(dog);<p>Мы узнали:</p>
67
static void printStaticInfo(Pet pet) { System.out.println( "Домашнее животное: " + pet.type + "\nКличка: " + pet.name + "\nВес: " + pet.weight + "\nСколько животное съело: " + pet.amountOfFood); System.out.println("Общее количество съеденной еды: " + amountOfAllFood); }Pet cat = new Pet(); cat.type = "Кот"; cat.name = "Барсик"; cat.weight = 10; Pet dog = new Pet(); dog.type = "Собака"; dog.name = "Тузик"; dog.weight = 15; Pet.printStaticInfo(cat); Pet.printStaticInfo(dog); cat.eat(4); dog.eat(6); Pet.printStaticInfo(cat); Pet.printStaticInfo(dog);<p>Мы узнали:</p>
68
<ul><li>что такое классы, из чего они состоят;</li>
68
<ul><li>что такое классы, из чего они состоят;</li>
69
<li>как создавать объекты класса;</li>
69
<li>как создавать объекты класса;</li>
70
<li>что такое методы, какая у них сигнатура и как их вызывать;</li>
70
<li>что такое методы, какая у них сигнатура и как их вызывать;</li>
71
<li>как использовать статические поля и методы классов.</li>
71
<li>как использовать статические поля и методы классов.</li>
72
</ul><p>Работать с классами и объектами в языке Java несложно, но есть несколько важных правил-примечаний, на которые нужно обратить внимание:</p>
72
</ul><p>Работать с классами и объектами в языке Java несложно, но есть несколько важных правил-примечаний, на которые нужно обратить внимание:</p>
73
<ol><li>Классы создаются в файлах с расширением .java. Главный класс должен называться так же, как имя файла. Например, в файле Main.java - класс Main.</li>
73
<ol><li>Классы создаются в файлах с расширением .java. Главный класс должен называться так же, как имя файла. Например, в файле Main.java - класс Main.</li>
74
<li>Разные классы в одном проекте могут иметь одинаковые имена, для этого им надо располагаться в разных пакетах (package).</li>
74
<li>Разные классы в одном проекте могут иметь одинаковые имена, для этого им надо располагаться в разных пакетах (package).</li>
75
<li>Нельзя создать метод или объявить переменную за пределами классов.</li>
75
<li>Нельзя создать метод или объявить переменную за пределами классов.</li>
76
<li>Каждый раз мы начинаем программу со статического метода<strong>main</strong>, который имеет возвращаемый тип<strong>int</strong>, а в параметрах у него указана переменная<strong>args</strong>типа<strong>String[]</strong>(массив строк).</li>
76
<li>Каждый раз мы начинаем программу со статического метода<strong>main</strong>, который имеет возвращаемый тип<strong>int</strong>, а в параметрах у него указана переменная<strong>args</strong>типа<strong>String[]</strong>(массив строк).</li>
77
<li>Статические поля нужно использовать правильно. Например, можно с помощью статического поля сделать счётчик количества созданных объектов - он описывает именно класс, в котором расположен, а не сами объекты данного класса. Но нет смысла делать статическим поле, описывающее объект, если не можете придумать, как использовать информацию из этого поля в другом классе.</li>
77
<li>Статические поля нужно использовать правильно. Например, можно с помощью статического поля сделать счётчик количества созданных объектов - он описывает именно класс, в котором расположен, а не сами объекты данного класса. Но нет смысла делать статическим поле, описывающее объект, если не можете придумать, как использовать информацию из этого поля в другом классе.</li>
78
</ol><a>Курс с трудоустройством: "Профессия Java-разработчик + ИИ" Узнать о курсе</a>
78
</ol><a>Курс с трудоустройством: "Профессия Java-разработчик + ИИ" Узнать о курсе</a>