Одна из базовых тем в Java, на которой строится код – классы и объекты. Они появляются буквально с первых строчек кода, но изучить их и начать использовать не совсем просто. Поэтому изучение объектов и классов растягивается на множество уроков. В этом уроке мы чуть больше окунемся в устройство языка. Не переживайте, если пазл все еще не складывается — это нормально. Классы, объекты и методы – сложная тема, требующая времени.
Мы уже сталкивались с методами, встроенными в Java, в разных формах:
System.out.println();
varname.toLowerCase();
varname.substring();
Integer.parseInt();
ChronoUnit.DAYS.between();
Все подобные вызовы можно разбить на две группы:
Из объектов мы пока сталкивались только со строками, но принцип одинаковый для любых объектов:
// Синтаксис создания объекта
// new – создает новый объект класса
var user = new User();
// Извлекает имя у пользователя
user.getName();
// Пример с другими объектами
// Извлекает текущий день
currentDate.getDayOfMonth();
// Проверка того, что файл существует
file.exists();
Такие методы выполняют действия над объектами, у которых они вызываются, и часто не принимают никаких аргументов. Объекты для простоты можно воспринимать как данные, которые доступны внутри метода. Например, метод строки toLowerCase()
внутри себя берет исходную строку, преобразует ее и возвращает результат наружу.
Кстати, System.out.println()
— это метод объекта out
, который лежит внутри класса System
.
Но не все вызовы методов связаны с объектами: иногда действие есть, а объекта нет. В таких случаях используются статические методы.
Что это может быть? Математические операции над числами или какие-то действия, которые не относятся к конкретному объекту, а имеют отношение ко всем объектам данного типа. В таком случае метод почти всегда опирается на данные, которые приходят в виде параметров:
// Получение случайного числа, вызов напрямую из класса Math
Math.random();
// Чтение данных по указанному пути
Files.readString(path);
Классы Math
и Files
в данном случае нужны только для вызова, потому что методы определены внутри них. Java не позволяет определять методы вне классов.
Честно говоря, не все так просто. Всегда можно придумать какой-то объект, над которым происходит вычисление. Также верно и обратное: всегда можно обойтись без объектов. Есть языки, в которых объектов нет вообще. В итоге все решает тот, кто проектирует конкретную часть кода:
// Без объекта, статический метод
Files.readString(path);
// Хотя можно было бы и через объект файла
path.read();
Все это плавно подводит нас к возможности самостоятельно создавать классы, объекты и методы, без чего невозможно себе представить ни одну программу, даже небольшую.
В переменной emoji
находится текстовый грустный смайлик -(. Ваша задача — сделать этот смайлик веселым с помощью двух преобразований:
replace()
)Должно получиться: :-). Выведите его на экран.
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1import java.io.ByteArrayOutputStream;
2import java.io.IOException;
3import java.io.PrintStream;
4
5import static org.assertj.core.api.Assertions.assertThat;
6
7class Test {
8 public static void main(String[] args) throws IOException {
9 App.main(null);
10
11 ByteArrayOutputStream out = new ByteArrayOutputStream();
12 System.setOut(new PrintStream(out));
13
14 App.main(null);
15
16 final var actual = out.toString().trim();
17
18 assertThat(actual).isEqualTo(":-)");
19 }
20}
21
Решение учителя откроется через: