JavaRush /Курсы /Java Syntax Pro /Объекты в Java

Объекты в Java

Java Syntax Pro
7 уровень , 3 лекция
Открыта

1. Объекты

Все в Java является объектом.

Вернее, очень мало чего в Java объектом не является. Например, примитивные типы. Но это скорее редкое исключение, чем правило.

Что же такое объект?

Объект — это сгруппированные вместе данные и методы для того, чтобы эти данные обрабатывать. Когда мы говорим о данных, имеем в виду переменные, конечно.

Про переменные объекта говорят, что это «данные объекта» или «состояние объекта».

Про методы объекта говорят: это «поведение объекта». Состояние объекта (переменные объекта) принято менять только с помощью методов того же объекта. Менять переменные объекта напрямую (не через методы объекта) считается дурным тоном.

У каждого объекта, как и у каждой переменной, есть тип. Этот тип определяется один раз при создании объекта и поменять его в дальнейшем нельзя. Типом объекта считается его класс.

У каждого объекта есть собственная копия переменных класса (полей класса). Если в классе была объявлена нестатическая переменная int a, и ваша программа во время работы создала 10 объектов этого класса, теперь в каждом объекте есть собственная переменная int a.

Взаимодействие с объектом

Самый удобный способ работы с объектом — сохранить ссылку на объект в переменную, и потом вызывать методы у этой переменной. Выглядит это для вас знакомо:

переменная.метод()

Где переменная — это переменная, которая хранит в себе ссылку на объект, а метод — это метод класса объекта.

Если вы хотите обратиться к полю (переменной) объекта, то тоже нужно использовать оператор точка:

переменная.поле

Где переменная — это переменная, которая хранит в себе ссылку на объект, а поле — это переменная класса (поле объекта).


2. Оператор new

Чтобы создать объект определенного класса, нужно воспользоваться оператором new. Вот как выглядит создание объекта в общем случае:

Класс переменная = new Класс(параметры);

Где Класс — это имя класса для объявления переменной и имя класса создаваемого объекта. Переменная — это переменная, в которую сохраняется ссылка на созданный объект. А параметры — это параметры метода создания объекта.

Какие именно могут быть параметры у объекта, решают программисты, которые пишут класс объекта.

Вы уже создавали объекты ранее, и даже пользовались именно этой конструкцией. Надеюсь, вы не забыли?

Scanner console = new Scanner(System.in);
int x = console.nextInt();

Scanner console — это создание переменной console типа Scanner. new Scanner(System.in) — это создание объекта типа Scanner. Ну а оператор присваивания заносит в переменную console ссылку на новый созданный объект.

Во второй строке мы вызываем метод nextInt() у объекта Scanner с помощью переменной console, которая хранит ссылку на объект типа Scanner.

Примеры создания объектов:

Код Описание
String s = new String("Привет");
Создает объект типа String
Scanner console = new Scanner("");
Создает объект типа Scanner
int[] data = new int[10];
Создает объект типа int[]: контейнер на 10 элементов типа int

Созданные объекты называют объектом класса или экземпляром класса, а класс — классом объекта. Например: переменная s хранит ссылку на экземпляр класса String.



3. Знакомство с классами

Думаю, вы уже убедились, что использовать классы, написанные другими программистами, очень удобно. А как насчет написания собственных классов?

Как понять, когда и где вам нужен собственный класс и как его сделать?

Программисты обычно создают свои классы, когда хотят ввести в программу новую сущность. Звучит не очень понятно? Тогда попробую объяснить, но начну издалека.

Группировка данных

Если немного упростить, можно сказать, что объект в Java — это область памяти, которая содержит переменные, объявленные в классе (поля класса). Или по-другому — переменные, объединенные в группы.

Допустим, в вашей программе нужно хранить координаты 100 точек и метод, чтобы вывести их на экран. Это можно сделать с помощью массивов. Например, так:

class Solution
{
   public static void printPoints(int[] x, int[] y, int[] color)
   {
     for (int i = 0; i < x.length; i++)
       System.out.println("Цвет точки x=" + x[i] + ", y=" + y[i] + " " + color[i]);
   }

   public static void main(String[] args)
   {
     int[] x = new int[100];
     int[] y = new int[100];
     int[] color = new int[100];
     printPoints(x, y, color);
   }
}

Было бы намного удобнее, если бы у нас сразу был тип для хранения всей информации по точкам: x, y, цвет. Ну а если в Java такого типа нет, можно его создать самостоятельно.

Для этого напишем код создания класса Point:

public class Point
{
   public int x;
   public int y;
   public int color;
}

Тогда код выше можно переписать в виде:

class Solution
{
   public static void printPoints(Point[] points)
   {
     for (int i = 0; i < points.length; i++)
       System.out.println("Цвет точки x=" + points[i].x + ", y=" + points[i].y + " " + points[i].color);
   }

   public static void main(String[] args)
   {
     Point[] data = new Point[100];
     for (int i = 0; i < data.length; i++)
       data[i] = new Point();
     printPoints(data);
   }
}

А теперь давайте добавим в класс Point метод, который будет выводить информацию об объекте:

public class Point
{
   public int x;
   public int y;
   public int color;
   public void print()
   {
     System.out.println("Цвет точки x=" + x + ", y=" + y + " " + color);
   }
}

Тогда класс Solution примет вид:

class Solution
{
   public static void printPoints(Point[] points)
   {
     for (int i = 0; i < points.length; i++)
       points[i].print();
   }

   public static void main(String[] args)
   {
     Point[] data = new Point[100];
     for (int i = 0; i < data.length; i++)
       data[i] = new Point();
     printPoints(data);
   }
}

Мы красиво спрятали внутрь точки (класс Point) информацию о ее координатах и метод, который выводит состояние объекта-точки на экран.

Классы — это ответ на управление сложностью программы. Большая программа становится проще, когда ее разбивают на много маленьких классов.


4. Mutable vs Immutable объекты

Когда-то давно мы с вами изучали константы в Java и пришли к не очень утешительному выводу. Константы позволяют защитить переменные от изменений, но не в состоянии защитить от изменений объекты, на которые эти переменные ссылаются.

В ответ на эту проблему в Java придумали объекты-константы. Или, как их еще называют, immutable-объекты — неизменяемые объекты.

Кстати, вы даже знаете один такой класс, чьи объекты нельзя менять — String. Объект класса String остается неизменным все время после создания. И как же разработчики Java добились этого?

Во-первых, все переменные класса String скрыты – объявлены private.

Во-вторых, наследоваться от класса String нельзя: он имеет модификатор final в объявлении класса.

В-третьих, что самое интересное, все методы класса String, которые по идее должны были менять существующий объект, не меняют его, а возвращают новый.

Например, метод toUpperCase() делает все буквы строки большими (заглавными). Но вместо изменения объекта, у которого он вызван, этот метод возвращает новый объект типа String, состоящий из заглавных букв:

String text = "Это очень важное сообщение";
String message = text.toUpperCase();

Вот что будет в памяти после выполнения этого кода:

Mutable vs Immutable объекты

Так что смело передавайте ваши строки в любые методы: никто их не поменяет.



Комментарии (508)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Alex Уровень 8
16 января 2026
Мне кажется очень важно уже сейчас понять следующее: Как вызываются в одном классе или ИЗ ДРУГОГО класса и как они меж собой взамодействуют: Публичные статические поля/методы Приватные статические поля/методы Публичные НЕстатические поля/методы Приватные НЕстатические поля/методы
Alex Уровень 8
16 января 2026
а еще ведь можно вызвать медоды в которые можно передавать доп параметры. Вызывать их на объекте и куча разных манипуляций....
Denis nkn Уровень 9
14 января 2026
Доброго времени суток всем! Несколько вопросов: 1) До меня не совсем доходит, как цикл for заполняет матрицу data параметрами x, y, color. Насколько я понял, создаются только 100 обьектов new Points () с полями без данных.. Или не так? 2) Также до меня не доходит, почему в цикле for в printPoints() передается матрица data, а уже в самом методе - матрица Point [] points? Интуиция подсказывает, что Point [] points - уже готовая матрица, введенная пользователем, а Point [] data - матрица, заполненная циклом for. Подскажите, пожалуйста, добрые люди!
Виктор Уровень 9
9 декабря 2025
В третьей главе говорится о декомпозиции, подход успешен во всех отраслях не только в программировании. Откуда все эти непонятливые с третьим пунктом взялись?
C0N5P1RACY Уровень 21
1 декабря 2025
Возрастное ограничение комикса уже стало 18+...
Vlad Уровень 15
29 октября 2025
А, ну да, все понятно и просто...пздц... 🤪🤨
Grigoryvvv Уровень 13 Expert
28 сентября 2025
02.10.2025 / 8 уровень Отвратительная лекция! Не стесняйтесь ставить оценку под лекцией снизу справа, где можно поставить минус и плюс. Я минусанул и поставил оценку "Ужасно, отвратительно". А то судя по оценке +631, она всем нравиться и всех всё устраивает! В одну лекцию запихали материал без должного объяснения "Объекты и классы", "Конструкторы", "Массив объектов". Главное сразу запихали массив, зачем??? Что бы запутать на ровном месте? Такое впечатление что всю лекцию писал грамотный специалист, потом вышел по делам, а в это время за комп сел Гомер Симпсон, нахреначил 3ю главу и убежал )) Рекомендую последовательно изучить: - https://metanit.com/java/tutorial/3.1.php - https://javarush.com/groups/posts/1949-znakomstvo-s-klassami-napisanie-sobstvennihkh-klassov-konstruktorih - https://ru.hexlet.io/qna/java/questions/kak-sozdat-massiv-ob-ektov-klassa-java - https://otus.ru/nest/post/956/ Как я понял в третьей главе в примере используется скрытый конструктор (который не пишется), а также обычный метод print. Конструктор отличается от обычного метода тем, что в обычном методе используется заглушка "void" если метод ничего не возвращает, public void print(); или, если метод возвращает значение, указывают типы возвращаемых значений "int" или "String", public static int metod(); public static String metod(); в конструкторе же, не указывается эти данные, он имеет более короткий вид, также название конструктора пишется с большой буквы, public Point();
Vadim Уровень 16
20 августа 2025
в 3 главе без бутылки не разберешься
Elisbeth Уровень 17
19 июля 2025
Трешняк полный.. особенно пункт 3
Никита Уровень 1
13 июля 2025
Условие задачи - создай 10 объектов типа String, 5 объектов типа int[], 2 объекта типа Scanner. Хотел немного упростить работу, но решение не прошло проверки, хотя условиям, как по мне, всё соответствует.

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        String[] strings = new String[10];
        for (int i = 0; i < 10; i++)
            strings[i] = new String("");
        int[][] integers = new int[5][];
        for (int i = 0; i < 5; i++)
            integers[i] = new int[1];
        Scanner console = new Scanner(System.in);
        console.close();
        Scanner string = new Scanner(strings[1]);
        string.close();
    }
}
Пришлось вручную создавать каждый объект...
Elisbeth Уровень 17
19 июля 2025
Ну вручную так-то делать это незачем. Копируешь и вставляешь, решение принимается.
Никита Уровень 1
21 июля 2025
да это-то понятно, ctrl+c/ctrl+v делал, суть не в этом :)
27 июля 2025
вы создаете массивы из объектов. А в задании просят просто объекты по-отдельности
Anonymous #3585174 Уровень 33
8 июня 2025
like