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.


undefined
8
Задача
Java Syntax Pro, 8 уровень, 4 лекция
Недоступна
Первые объекты
Используя оператор new в методе main(), создай: - 10 объектов типа String; - 5 объектов типа int[] (массивов значений int); - 2 объекта типа Scanner.

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 объекты

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