HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#статьи</a></p>
1 <p><a>#статьи</a></p>
2 <ul><li>25 окт 2019</li>
2 <ul><li>25 окт 2019</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><p>ООП - это то, на чём держится вся разработка на Java. С помощью объектов и классов можно создать любой функционал быстрее.</p>
4 </ul><p>ООП - это то, на чём держится вся разработка на Java. С помощью объектов и классов можно создать любой функционал быстрее.</p>
5 <p> vlada_maestro / shutterstock</p>
5 <p> vlada_maestro / shutterstock</p>
6 <p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
6 <p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
7 <p><a>Объектно-ориентированное программирование</a> - это подход к разработке приложений с помощью классов и объектов. Он позволяет писать значительно меньше кода и при этом реализовывать больше возможностей, чем при функциональном проектировании программ.</p>
7 <p><a>Объектно-ориентированное программирование</a> - это подход к разработке приложений с помощью классов и объектов. Он позволяет писать значительно меньше кода и при этом реализовывать больше возможностей, чем при функциональном проектировании программ.</p>
8 <p>В программе, написанной по принципам ООП, отдельные компоненты рассматриваются как предметы из реального мира, такие как дом, дерево, кот, человек и даже Java-разработчик. У каждого объекта есть свои атрибуты. Вот какими они будут у принтера: цвет, марка, скорость печати, объём оставшейся краски и так далее.</p>
8 <p>В программе, написанной по принципам ООП, отдельные компоненты рассматриваются как предметы из реального мира, такие как дом, дерево, кот, человек и даже Java-разработчик. У каждого объекта есть свои атрибуты. Вот какими они будут у принтера: цвет, марка, скорость печати, объём оставшейся краски и так далее.</p>
9 <p>Также принтеру свойственно определённое "поведение": печать, сканирование, копирование, проверка наличия краски, подключение к Wi-Fi и так далее - всё это называется методами.</p>
9 <p>Также принтеру свойственно определённое "поведение": печать, сканирование, копирование, проверка наличия краски, подключение к Wi-Fi и так далее - всё это называется методами.</p>
10 <p>Каждый принтер уникален, поэтому обладает своим идентификатором, по которому к нему можно обратиться, чтобы узнать или изменить тот или иной атрибут, а также вызвать метод:</p>
10 <p>Каждый принтер уникален, поэтому обладает своим идентификатором, по которому к нему можно обратиться, чтобы узнать или изменить тот или иной атрибут, а также вызвать метод:</p>
11 Объект.метод() Объект.атрибут = значение;<p>Однако прописывать все атрибуты и методы для каждого объекта было бы слишком сложно, поэтому используются классы - общий шаблон того, как должен вести себя объект.</p>
11 Объект.метод() Объект.атрибут = значение;<p>Однако прописывать все атрибуты и методы для каждого объекта было бы слишком сложно, поэтому используются классы - общий шаблон того, как должен вести себя объект.</p>
12 <p>Допустим, существует класс<em>Бумага</em>, которому прописываются свои параметры и методы: цвет, цена, размер, толщина и так далее. Каждый отдельный объект является экземпляром класса. Например, можно создать объект<em>листБумаги1, листБумаги2, листБумаги3</em> - у всех них будут одинаковые атрибуты и поведение, но разные значения:</p>
12 <p>Допустим, существует класс<em>Бумага</em>, которому прописываются свои параметры и методы: цвет, цена, размер, толщина и так далее. Каждый отдельный объект является экземпляром класса. Например, можно создать объект<em>листБумаги1, листБумаги2, листБумаги3</em> - у всех них будут одинаковые атрибуты и поведение, но разные значения:</p>
13 листБумаги1.размер = А4; листБумаги1.цена = 2; листБумаги2.размер = А5; листБумаги2.цвет = серый;<p>Эту бумагу можно, например, передать объекту класса<em>Принтер</em>, чтобы её распечатать:</p>
13 листБумаги1.размер = А4; листБумаги1.цена = 2; листБумаги2.размер = А5; листБумаги2.цвет = серый;<p>Эту бумагу можно, например, передать объекту класса<em>Принтер</em>, чтобы её распечатать:</p>
14 принтерВОфисе.печать(текст, листБумаги1);<p>Без объектов нам бы пришлось создавать отдельные функции и работать с ними. Сейчас мы можем написать такой код:</p>
14 принтерВОфисе.печать(текст, листБумаги1);<p>Без объектов нам бы пришлось создавать отдельные функции и работать с ними. Сейчас мы можем написать такой код:</p>
15 Принтер принтерВОфисе = новый Принтер(127.0.0.1, А4); Бумага листБумаги1 = новая Бумага(А4); Строка текст = "Привет, мир!"; ПринтерВОфисе.печать(текст, листБумаги1);<p>То есть мы создаём объект и даём ему параметры: адрес и размер. Потом отправляем ему текст и лист бумаги, а он печатает это так, как прописано в теле метода.</p>
15 Принтер принтерВОфисе = новый Принтер(127.0.0.1, А4); Бумага листБумаги1 = новая Бумага(А4); Строка текст = "Привет, мир!"; ПринтерВОфисе.печать(текст, листБумаги1);<p>То есть мы создаём объект и даём ему параметры: адрес и размер. Потом отправляем ему текст и лист бумаги, а он печатает это так, как прописано в теле метода.</p>
16 <p>Без классов нам бы пришлось создавать множество негруппированных переменных, в которых хранилась бы вся эта информация:</p>
16 <p>Без классов нам бы пришлось создавать множество негруппированных переменных, в которых хранилась бы вся эта информация:</p>
17 Строка адресПринтераВОфисе = 127.0.0.1; Число размерПринтераВОфисе = А4; Число размерЛиста1 = А4; напечататьТекст(текст, адресПринтераВОфисе, размерПринтераВОфисе, размерЛиста1) { если (размерЛиста1 == размерПринтераВОфисе) { отправитьТекст(текст, адресПринтераВОфисе); } }<p>Представьте, как раздуется код от количества переменных и функций, которые нужны, чтобы распечатать обычный лист. А ведь нужно написать ещё и функцию заправки, сканирования, копирования и так далее.</p>
17 Строка адресПринтераВОфисе = 127.0.0.1; Число размерПринтераВОфисе = А4; Число размерЛиста1 = А4; напечататьТекст(текст, адресПринтераВОфисе, размерПринтераВОфисе, размерЛиста1) { если (размерЛиста1 == размерПринтераВОфисе) { отправитьТекст(текст, адресПринтераВОфисе); } }<p>Представьте, как раздуется код от количества переменных и функций, которые нужны, чтобы распечатать обычный лист. А ведь нужно написать ещё и функцию заправки, сканирования, копирования и так далее.</p>
18 <p>Пришлось бы несколько раз дублировать одинаковые фрагменты кода, чтобы написать что-то. А ООП позволяет сократить код, а значит, быстрее разрабатывать программы, а также читать и переписывать их.</p>
18 <p>Пришлось бы несколько раз дублировать одинаковые фрагменты кода, чтобы написать что-то. А ООП позволяет сократить код, а значит, быстрее разрабатывать программы, а также читать и переписывать их.</p>
19 <p>Создавая программу, нужно объявить класс с её именем, а потом добавить метод<em>main</em> - из него начинается работа приложения:</p>
19 <p>Создавая программу, нужно объявить класс с её именем, а потом добавить метод<em>main</em> - из него начинается работа приложения:</p>
20 public class ClassesProgram { public static void main(String[] arg) { System.out.println("Hello, World!"); } }<p>В Java всё, что не является объектом, является классом. Даже<em>System</em>, с помощью которого выводится текст, - это объект.</p>
20 public class ClassesProgram { public static void main(String[] arg) { System.out.println("Hello, World!"); } }<p>В Java всё, что не является объектом, является классом. Даже<em>System</em>, с помощью которого выводится текст, - это объект.</p>
21 <p>Можно создать переменные для этого класса - атрибуты:</p>
21 <p>Можно создать переменные для этого класса - атрибуты:</p>
22 public class ClassesProgram { public static int num1 = 25; public static int num2 = 2; public static void main(String[] arg) { int sum = num1 * num2; System.out.println("sum: " + sum); } }<p>Эти переменные вызываются из основного метода и умножаются. Вот как выглядит результат таких вычислений:</p>
22 public class ClassesProgram { public static int num1 = 25; public static int num2 = 2; public static void main(String[] arg) { int sum = num1 * num2; System.out.println("sum: " + sum); } }<p>Эти переменные вызываются из основного метода и умножаются. Вот как выглядит результат таких вычислений:</p>
23 <p>Пока не обращайте внимания на слова<em>public</em>и <em>static</em> - про них мы расскажем позже. Так же можно создавать методы, похожие на <em>main</em>. Для них укажите модификаторы доступа<em>(public и static)</em>, возвращаемый тип и название:</p>
23 <p>Пока не обращайте внимания на слова<em>public</em>и <em>static</em> - про них мы расскажем позже. Так же можно создавать методы, похожие на <em>main</em>. Для них укажите модификаторы доступа<em>(public и static)</em>, возвращаемый тип и название:</p>
24 public class ClassesProgram { public static int GetCube(int x) { return x * x * x; } public static void main(String[] arg) { int cube = GetCube(5); System.out.println("Cube: " + cube); } }<p>Запустив программу, мы увидим результат работы метода<em>GetCube ():</em></p>
24 public class ClassesProgram { public static int GetCube(int x) { return x * x * x; } public static void main(String[] arg) { int cube = GetCube(5); System.out.println("Cube: " + cube); } }<p>Запустив программу, мы увидим результат работы метода<em>GetCube ():</em></p>
25 <p>Пока всё работает в пределах основного класса, но можно создать и другие. Для наглядности мы будем делать это на примере кода мессенджера. Здесь будут использоваться классы<em>Сообщение (Message)</em>и <em>Пользователь (User).</em></p>
25 <p>Пока всё работает в пределах основного класса, но можно создать и другие. Для наглядности мы будем делать это на примере кода мессенджера. Здесь будут использоваться классы<em>Сообщение (Message)</em>и <em>Пользователь (User).</em></p>
26 <p>Чтобы начать работать с классами, создайте папку для своего проекта: например, 01. Добавьте в неё ещё два каталога -<em>src</em>и <em>bin</em>. В первом будут храниться исходники, а во втором - скомпилированные файлы.</p>
26 <p>Чтобы начать работать с классами, создайте папку для своего проекта: например, 01. Добавьте в неё ещё два каталога -<em>src</em>и <em>bin</em>. В первом будут храниться исходники, а во втором - скомпилированные файлы.</p>
27 <p>Теперь скомпилировать файл можно так:</p>
27 <p>Теперь скомпилировать файл можно так:</p>
28 javac -d bin src/ClassesProgram.java<p>А запустить - так:</p>
28 javac -d bin src/ClassesProgram.java<p>А запустить - так:</p>
29 java -cp ./bin ClassesProgram<p>Все классы должны находиться в отдельных файлах. которые нужно объединить в пакет. Его название должно выглядеть так:<em>com.sitename.packagename</em>. Хотя вы можете обойтись и без домена<em>packagename</em>. Чтобы создать пакет, сначала в папке<em>src</em>создайте следующую структуру:</p>
29 java -cp ./bin ClassesProgram<p>Все классы должны находиться в отдельных файлах. которые нужно объединить в пакет. Его название должно выглядеть так:<em>com.sitename.packagename</em>. Хотя вы можете обойтись и без домена<em>packagename</em>. Чтобы создать пакет, сначала в папке<em>src</em>создайте следующую структуру:</p>
30 src\packagename\component\file.java<p>В нашем случае для основного файла путь будет таким:</p>
30 src\packagename\component\file.java<p>В нашем случае для основного файла путь будет таким:</p>
31 src\mypackege\classesprogram\ClassesProgram.java<p>В тот же каталог поместите<em>User.java</em>и <em>Message.java</em>. После этого в начало каждого файла добавьте такую строчку:</p>
31 src\mypackege\classesprogram\ClassesProgram.java<p>В тот же каталог поместите<em>User.java</em>и <em>Message.java</em>. После этого в начало каждого файла добавьте такую строчку:</p>
32 package mypackage.classesprogram;<p>Она означает, что этот код относится к определённому пакету. И чтобы воспользоваться каким-то классом, нужно добавить в начало основной программы несколько команд:</p>
32 package mypackage.classesprogram;<p>Она означает, что этот код относится к определённому пакету. И чтобы воспользоваться каким-то классом, нужно добавить в начало основной программы несколько команд:</p>
33 import mypackage.classesprogram.User; import mypackage.classesprogram.Message;<p>Теперь можно компилировать программу с помощью команды:</p>
33 import mypackage.classesprogram.User; import mypackage.classesprogram.Message;<p>Теперь можно компилировать программу с помощью команды:</p>
34 javac -sourcepath ./src -d bin src/mypackage/classesprogram/ClassesProgram.java<p>Если вы всё сделали правильно, в папке<em>bin</em>появится такая же структура, как в <em>src</em>. Вот код корневого файла приложения:</p>
34 javac -sourcepath ./src -d bin src/mypackage/classesprogram/ClassesProgram.java<p>Если вы всё сделали правильно, в папке<em>bin</em>появится такая же структура, как в <em>src</em>. Вот код корневого файла приложения:</p>
35 package mypackage.classesprogram; //Добавляем файл в пакет //Подключаем отдельные классы import mypackage.classesprogram.User; import mypackage.classesprogram.Message; //Подключаем пакет для работы с пользовательским вводом import java.util.Scanner; public class ClassesProgram { public static void main(String[] arg) { Scanner in = new Scanner(System.in); System.out.println("Success!"); } }<p>Теперь этот код можно запустить, прописав такую команду:</p>
35 package mypackage.classesprogram; //Добавляем файл в пакет //Подключаем отдельные классы import mypackage.classesprogram.User; import mypackage.classesprogram.Message; //Подключаем пакет для работы с пользовательским вводом import java.util.Scanner; public class ClassesProgram { public static void main(String[] arg) { Scanner in = new Scanner(System.in); System.out.println("Success!"); } }<p>Теперь этот код можно запустить, прописав такую команду:</p>
36 java -classpath ./bin mypackage.classesprogram.ClassesProgram<p>Вот что выведет консоль:</p>
36 java -classpath ./bin mypackage.classesprogram.ClassesProgram<p>Вот что выведет консоль:</p>
37 <p>Этот процесс можно ускорить, если скачать IDE. Там для добавления нового класса достаточно будет выполнить несколько действий в графическом интерфейсе. Например, в <em>Eclipse</em>можно нажать<em>File -&gt; new -&gt; class</em> - этого будет достаточно.</p>
37 <p>Этот процесс можно ускорить, если скачать IDE. Там для добавления нового класса достаточно будет выполнить несколько действий в графическом интерфейсе. Например, в <em>Eclipse</em>можно нажать<em>File -&gt; new -&gt; class</em> - этого будет достаточно.</p>
38 <p>Но если вы пока не уверены, что хотите продолжать работать на Java, можете поэкспериментировать в консоли.</p>
38 <p>Но если вы пока не уверены, что хотите продолжать работать на Java, можете поэкспериментировать в консоли.</p>
39 <p>Теперь можно приступить к созданию классов. Начнём с пользователя:</p>
39 <p>Теперь можно приступить к созданию классов. Начнём с пользователя:</p>
40 package mypackage.classesprogram; public class User { public String name; public int age; }<p>Слово<em>public</em>выступает модификатором доступа - он определяет, откуда будет доступен компонент. Для класса можно указать следующие модификаторы:</p>
40 package mypackage.classesprogram; public class User { public String name; public int age; }<p>Слово<em>public</em>выступает модификатором доступа - он определяет, откуда будет доступен компонент. Для класса можно указать следующие модификаторы:</p>
41 <ul><li><strong>public</strong> - доступно в любых частях программы (применимо и к другим компонентам);</li>
41 <ul><li><strong>public</strong> - доступно в любых частях программы (применимо и к другим компонентам);</li>
42 <li><strong>default</strong> - доступно только классам из того же пакета.</li>
42 <li><strong>default</strong> - доступно только классам из того же пакета.</li>
43 </ul><p>Теперь в основном файле можно создать объект класса<em>User:</em></p>
43 </ul><p>Теперь в основном файле можно создать объект класса<em>User:</em></p>
44 Scanner in = new Scanner(System.in); User user1 = new User(); System.out.println("Enter your name: "); user1.name = in.nextLine(); System.out.println("Enter your age: "); user1.age = in.nextInt(); System.out.println(user1.name + " is " + user1.age + " years old!");<p>Мы указали для объекта<em>user1</em>класс<em>User</em>, а после оператора присваивания указали ключевое слово new<em></em>и запустили конструктор (об этом позже). Вот как будет выполнена программа:</p>
44 Scanner in = new Scanner(System.in); User user1 = new User(); System.out.println("Enter your name: "); user1.name = in.nextLine(); System.out.println("Enter your age: "); user1.age = in.nextInt(); System.out.println(user1.name + " is " + user1.age + " years old!");<p>Мы указали для объекта<em>user1</em>класс<em>User</em>, а после оператора присваивания указали ключевое слово new<em></em>и запустили конструктор (об этом позже). Вот как будет выполнена программа:</p>
45 <p>Создание объекта называется объявлением экземпляра класса - тут же можно использовать конструктор, чтобы сразу задать значения атрибутам.</p>
45 <p>Создание объекта называется объявлением экземпляра класса - тут же можно использовать конструктор, чтобы сразу задать значения атрибутам.</p>
46 <p>Для этого нужно в теле класса создать метод с таким же названием, что и класс. Ему можно передать аргументы, с которыми можно провести операции:</p>
46 <p>Для этого нужно в теле класса создать метод с таким же названием, что и класс. Ему можно передать аргументы, с которыми можно провести операции:</p>
47 public class User { public String name; public int age; public User(String name, int age) { this.name = name; this.age = age; System.out.println("User " + this.name + " was created. His (her) age is " + this.age); } }<p>Обратите внимание, что внутри класса атрибуты вызываются с помощью ключевого слова<em>this</em>. Это нужно для того, чтобы компилятор не путался, с какой переменной работать - например, в случае, если у аргумента такое же имя, как и у атрибута:</p>
47 public class User { public String name; public int age; public User(String name, int age) { this.name = name; this.age = age; System.out.println("User " + this.name + " was created. His (her) age is " + this.age); } }<p>Обратите внимание, что внутри класса атрибуты вызываются с помощью ключевого слова<em>this</em>. Это нужно для того, чтобы компилятор не путался, с какой переменной работать - например, в случае, если у аргумента такое же имя, как и у атрибута:</p>
48 <p>Теперь, чтобы создать объект, нужно немного поменять код:</p>
48 <p>Теперь, чтобы создать объект, нужно немного поменять код:</p>
49 System.out.println("Enter your name: "); String name = in.nextLine(); System.out.println("Enter your age: "); int age = in.nextInt(); User user1 = new User(name, age);<p>Дальше можно создать класс для работы с сообщениями:</p>
49 System.out.println("Enter your name: "); String name = in.nextLine(); System.out.println("Enter your age: "); int age = in.nextInt(); User user1 = new User(name, age);<p>Дальше можно создать класс для работы с сообщениями:</p>
50 package mypackage.classesprogram; import mypackage.classesprogram.User; public class Message { private String text; private User from; private User to; public Message(String text, User from, User to) { this.text = text; this.from = from; this.to = to; System.out.println(this.from.name + " wrote to " + this.to.name + ": " + this.text); } }<p>Обратите внимание, что в этот раз для атрибутов<em>from</em>и<em>to</em>мы задали модификатор<em>private</em>, а в качестве типа стоит<em>User.</em>Private позволяет закрыть доступ к элементам извне - то есть их можно менять только внутри методов самого класса.</p>
50 package mypackage.classesprogram; import mypackage.classesprogram.User; public class Message { private String text; private User from; private User to; public Message(String text, User from, User to) { this.text = text; this.from = from; this.to = to; System.out.println(this.from.name + " wrote to " + this.to.name + ": " + this.text); } }<p>Обратите внимание, что в этот раз для атрибутов<em>from</em>и<em>to</em>мы задали модификатор<em>private</em>, а в качестве типа стоит<em>User.</em>Private позволяет закрыть доступ к элементам извне - то есть их можно менять только внутри методов самого класса.</p>
51 <p>Это позволяет защитить атрибуты от незапланированного доступа. Если же вы хотите получать или менять атрибуты, можно воспользоваться<em>getter</em>и<em>setter.</em>Это специальные методы, которые позволяют обратиться к защищённой переменной:</p>
51 <p>Это позволяет защитить атрибуты от незапланированного доступа. Если же вы хотите получать или менять атрибуты, можно воспользоваться<em>getter</em>и<em>setter.</em>Это специальные методы, которые позволяют обратиться к защищённой переменной:</p>
52 public String getText() { return this.text; } public void setTo(User to) { this.to = to; }<p>Теперь можно написать код, который будет создавать сообщение:</p>
52 public String getText() { return this.text; } public void setTo(User to) { this.to = to; }<p>Теперь можно написать код, который будет создавать сообщение:</p>
53 System.out.println("Enter your name: "); String name = in.nextLine(); System.out.println("Enter your age: "); int age = in.nextInt(); User user1 = new User(name, age); User user2 = new User("John", 20); System.out.println("Enter your message: "); String text = in.nextLine(); Message msg = new Message(text, user1, user2);<p>Вот как это работает:</p>
53 System.out.println("Enter your name: "); String name = in.nextLine(); System.out.println("Enter your age: "); int age = in.nextInt(); User user1 = new User(name, age); User user2 = new User("John", 20); System.out.println("Enter your message: "); String text = in.nextLine(); Message msg = new Message(text, user1, user2);<p>Вот как это работает:</p>
54 <p>Так с помощью классов и объектов можно быстро создать какую-нибудь программу, используя минимум кода. Можно также добавить класс<em>Chat</em>, в котором будут храниться все сообщения от одного пользователя к другому - для этого нужно освоить не только классы, но и коллекции.</p>
54 <p>Так с помощью классов и объектов можно быстро создать какую-нибудь программу, используя минимум кода. Можно также добавить класс<em>Chat</em>, в котором будут храниться все сообщения от одного пользователя к другому - для этого нужно освоить не только классы, но и коллекции.</p>
55 <p>Это лишь малая часть того, как происходит работа с объектами и классами. Существуют ещё такие понятия, как наследование, полиморфизм, инкапсуляция и многое другое.</p>
55 <p>Это лишь малая часть того, как происходит работа с объектами и классами. Существуют ещё такие понятия, как наследование, полиморфизм, инкапсуляция и многое другое.</p>
56 - <a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узайте, чему можно научиться на курсе. Смотреть программу</a>
56 + <a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>