Что такое класс в Java
ООП — это то, на чём держится вся разработка на Java. С помощью объектов и классов можно создать любой функционал быстрее.


vlada_maestro / shutterstock
Объектно-ориентированное программирование — это подход к разработке приложений с помощью классов и объектов. Он позволяет писать значительно меньше кода и при этом реализовывать больше возможностей, чем при функциональном проектировании программ.
В программе, написанной по принципам ООП, отдельные компоненты рассматриваются как предметы из реального мира, такие как дом, дерево, кот, человек и даже Java-разработчик. У каждого объекта есть свои атрибуты. Вот какими они будут у принтера: цвет, марка, скорость печати, объём оставшейся краски и так далее.
Также принтеру свойственно определённое «поведение»: печать, сканирование, копирование, проверка наличия краски, подключение к Wi-Fi и так далее — всё это называется методами.
Каждый принтер уникален, поэтому обладает своим идентификатором, по которому к нему можно обратиться, чтобы узнать или изменить тот или иной атрибут, а также вызвать метод:
Объект.метод()
Объект.атрибут = значение;
Однако прописывать все атрибуты и методы для каждого объекта было бы слишком сложно, поэтому используются классы — общий шаблон того, как должен вести себя объект.
Допустим, существует класс Бумага, которому прописываются свои параметры и методы: цвет, цена, размер, толщина и так далее. Каждый отдельный объект является экземпляром класса. Например, можно создать объект листБумаги1, листБумаги2, листБумаги3 — у всех них будут одинаковые атрибуты и поведение, но разные значения:
листБумаги1.размер = А4; листБумаги1.цена = 2;
листБумаги2.размер = А5; листБумаги2.цвет = серый;
Эту бумагу можно, например, передать объекту класса Принтер, чтобы её распечатать:
принтерВОфисе.печать(текст, листБумаги1);
Без объектов нам бы пришлось создавать отдельные функции и работать с ними. Сейчас мы можем написать такой код:
Принтер принтерВОфисе = новый Принтер(127.0.0.1, А4);
Бумага листБумаги1 = новая Бумага(А4);
Строка текст = «Привет, мир!»;
ПринтерВОфисе.печать(текст, листБумаги1);
То есть мы создаём объект и даём ему параметры: адрес и размер. Потом отправляем ему текст и лист бумаги, а он печатает это так, как прописано в теле метода.
Без классов нам бы пришлось создавать множество негруппированных переменных, в которых хранилась бы вся эта информация:
Строка адресПринтераВОфисе = 127.0.0.1;
Число размерПринтераВОфисе = А4;
Число размерЛиста1 = А4;
напечататьТекст(текст, адресПринтераВОфисе, размерПринтераВОфисе, размерЛиста1) {
если (размерЛиста1 == размерПринтераВОфисе) {
отправитьТекст(текст, адресПринтераВОфисе);
}
}
Представьте, как раздуется код от количества переменных и функций, которые нужны, чтобы распечатать обычный лист. А ведь нужно написать ещё и функцию заправки, сканирования, копирования и так далее.
Пришлось бы несколько раз дублировать одинаковые фрагменты кода, чтобы написать что-то. А ООП позволяет сократить код, а значит, быстрее разрабатывать программы, а также читать и переписывать их.
Как работают классы в Java
Создавая программу, нужно объявить класс с её именем, а потом добавить метод main — из него начинается работа приложения:
public class ClassesProgram {
public static void main(String[] arg) {
System.out.println("Hello, World!");
}
}
В Java всё, что не является объектом, является классом. Даже System, с помощью которого выводится текст, — это объект.
Можно создать переменные для этого класса — атрибуты:
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);
}
}
Эти переменные вызываются из основного метода и умножаются. Вот как выглядит результат таких вычислений:

Пока не обращайте внимания на слова public и static — про них мы расскажем позже. Так же можно создавать методы, похожие на main. Для них укажите модификаторы доступа (public и static), возвращаемый тип и название:
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);
}
}
Запустив программу, мы увидим результат работы метода GetCube ():

Пока всё работает в пределах основного класса, но можно создать и другие. Для наглядности мы будем делать это на примере кода мессенджера. Здесь будут использоваться классы Сообщение (Message) и Пользователь (User).
Чтобы начать работать с классами, создайте папку для своего проекта: например, 01. Добавьте в неё ещё два каталога — src и bin. В первом будут храниться исходники, а во втором — скомпилированные файлы.
Теперь скомпилировать файл можно так:
javac -d bin src/ClassesProgram.java
А запустить — так:
java -cp ./bin ClassesProgram
Все классы должны находиться в отдельных файлах. которые нужно объединить в пакет. Его название должно выглядеть так: com.sitename.packagename. Хотя вы можете обойтись и без домена packagename. Чтобы создать пакет, сначала в папке src создайте следующую структуру:
src\packagename\component\file.java
В нашем случае для основного файла путь будет таким:
src\mypackege\classesprogram\ClassesProgram.java
В тот же каталог поместите User.java и Message.java. После этого в начало каждого файла добавьте такую строчку:
package mypackage.classesprogram;
Она означает, что этот код относится к определённому пакету. И чтобы воспользоваться каким-то классом, нужно добавить в начало основной программы несколько команд:
import mypackage.classesprogram.User;
import mypackage.classesprogram.Message;
Теперь можно компилировать программу с помощью команды:
javac -sourcepath ./src -d bin src/mypackage/classesprogram/ClassesProgram.java
Если вы всё сделали правильно, в папке bin появится такая же структура, как в src. Вот код корневого файла приложения:
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!");
}
}
Теперь этот код можно запустить, прописав такую команду:
java -classpath ./bin mypackage.classesprogram.ClassesProgram
Вот что выведет консоль:

Этот процесс можно ускорить, если скачать IDE. Там для добавления нового класса достаточно будет выполнить несколько действий в графическом интерфейсе. Например, в Eclipse можно нажать File -> new -> class — этого будет достаточно.
Но если вы пока не уверены, что хотите продолжать работать на Java, можете поэкспериментировать в консоли.
Как создать класс в Java
Теперь можно приступить к созданию классов. Начнём с пользователя:
package mypackage.classesprogram;
public class User {
public String name;
public int age;
}
Слово public выступает модификатором доступа — он определяет, откуда будет доступен компонент. Для класса можно указать следующие модификаторы:
- public — доступно в любых частях программы (применимо и к другим компонентам);
- default — доступно только классам из того же пакета.
Теперь в основном файле можно создать объект класса User:
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!");
Мы указали для объекта user1 класс User, а после оператора присваивания указали ключевое слово new и запустили конструктор (об этом позже). Вот как будет выполнена программа:

Создание объекта называется объявлением экземпляра класса — тут же можно использовать конструктор, чтобы сразу задать значения атрибутам.
Для этого нужно в теле класса создать метод с таким же названием, что и класс. Ему можно передать аргументы, с которыми можно провести операции:
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);
}
}
Обратите внимание, что внутри класса атрибуты вызываются с помощью ключевого слова this. Это нужно для того, чтобы компилятор не путался, с какой переменной работать — например, в случае, если у аргумента такое же имя, как и у атрибута:
this.name = name;
Теперь, чтобы создать объект, нужно немного поменять код:
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);
Дальше можно создать класс для работы с сообщениями:
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);
}
}
Обратите внимание, что в этот раз для атрибутов from и to мы задали модификатор private, а в качестве типа стоит User. Private позволяет закрыть доступ к элементам извне — то есть их можно менять только внутри методов самого класса.
Это позволяет защитить атрибуты от незапланированного доступа. Если же вы хотите получать или менять атрибуты, можно воспользоваться getter и setter. Это специальные методы, которые позволяют обратиться к защищённой переменной:
public String getText() {
return this.text;
}
public void setTo(User to) {
this.to = to;
}
Теперь можно написать код, который будет создавать сообщение:
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);
Вот как это работает:

Так с помощью классов и объектов можно быстро создать какую-нибудь программу, используя минимум кода. Можно также добавить класс Chat, в котором будут храниться все сообщения от одного пользователя к другому — для этого нужно освоить не только классы, но и коллекции.
Заключение
Это лишь малая часть того, как происходит работа с объектами и классами. Существуют ещё такие понятия, как наследование, полиморфизм, инкапсуляция и многое другое.