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 |
|
Создает объект типа Scanner |
|
Создает объект типа 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();
Вот что будет в памяти после выполнения этого кода:
Так что смело передавайте ваши строки в любые методы: никто их не поменяет.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ