Создание объектов в 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 и др. Однако использование примитивных типов выгодней с точки зрения экономии памяти.

Создано