Создание объектов в Java
Создание объектов в Java и связывание их с переменными чаще всего выглядит так:
Second second = new Second();
В правой части с помощью ключевого слова new создается объект от класса Second. Созданный объект присваивается переменной second, чей тип указывается перед именем переменной. В случае наличия наследственных связей тип переменной может не совпадать с типом создаваемого объекта.
Файл Main.java:
public class Main { public static void main(String[] args) { Second second = new Second(); } }
Файл Second.java:
class Second { Second() { System.out.println("Object created"); } }
В классе Second есть только один метод – это конструктор. В данном случае, когда создается объект, на экран будет выведено сообщение.
Когда мы используем библиотечные классы Java, например String, то создаем объекты также. Выражение
String str = "Hello";
равносильно
String str = new String("Hello");
Переменные можно сначала объявлять, а потом присваивать им значения:
String str; str = "Hello";
В Java переменные объектных типов являются ссылочными, то есть хранят не сам объект, а ссылку на него. Отсюда следует, что 1) методы классов меняют переданные им в качестве аргументов объекты, и 2) на один объект может ссылаться множество переменных.
Переменной-ссылке можно присвоить значение null. Такая переменная начинает ссылаться на адрес 0. Виртуальная машина Java воспринимает указание на этот адрес как отсутствие объекта.
Обнуление ссылочной переменной ведет к уничтожению хранимого в памяти объекта только в том случае, если нет других ссылок-переменных на него.
В Java не все объекты создаются с помощью классов. Существуют примитивные типы: пять целочисленных (byte, char, short, int, long), два вещественных (float и double) и булев тип (boolean). При объявлении переменных этих типов используется маленькая буква в названии типа. Например:
int number; double pi = 3.14;
Если переменная примитивного типа передается в функцию в качестве аргумента, то никакая ссылка на объект туда не передается, происходит копирование значения переменной. Другими словами, действия внутри метода не изменяют значения переданных переменных.
В Java все объекты преобразуются к строковому типу при выводе на экран. При этом для объектов неявно вызывается метод toString родительского класса Object, от которого наследуются все классы. В случае необходимости метод можно вызывать явно. Следующие две строки равносильны:
System.out.println(second); System.out.println(second.toString());
Метод toString() класса Object возвращает строку, состоящую из имени класса и шестнадцатеричного адреса объекта в памяти. То есть по умолчанию вывод будет примерно такой:
Second@1540e19d
Понятно, что можно переопределить метода toString() в дочернем классе:
@Override public String toString() { return "It's the second object"; }
В случае примитивных типов явное преобразование к строке происходит через вызов метода аналогичного типу класса:
int b = 100; String s = Integer.toString(b); // String s = b.toString(); - ошибка
В Java есть классы Integer, Double и др. Однако использование примитивных типов выгодней с точки зрения экономии памяти.