Что такое класс в Java

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

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

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

Евгений Кучерявый

Пишет о программировании, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.


Также принтеру свойственно определённое «поведение»: печать, сканирование, копирование, проверка наличия краски, подключение к 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, в котором будут храниться все сообщения от одного пользователя к другому — для этого нужно освоить не только классы, но и коллекции.

Заключение

Это лишь малая часть того, как происходит работа с объектами и классами. Существуют ещё такие понятия, как наследование, полиморфизм, инкапсуляция и многое другое.

Если вам интересны объектно-ориентированное программирование и Java, запишитесь на курс «Java-разработчик». Вы на практике научитесь работать в парадигме ООП, соберёте портфолио и сможете стать востребованным специалистом.

Курс

Java-разработчик


Мы избавим вас от страха перед кодингом, развеем миф о том, что программист должен в совершенстве знать математику, научим критическому мышлению и основам Java –самого популярного языка в мире.

Хочешь получать крутые статьи по программированию?
Подпишись на рассылку Skillbox