Добавить в корзинуПозвонить
Найти в Дзене
ГАУС IT

Знакомство с классом String и Class

Как уже указывалось, класс String занимает в Java особое положение. Экземпляры только этого класса можно создавать без использования ключевого слова new. Каждый строковый литерал порождает экземпляр String, и это единственный литерал (кроме null), имеющий объектный тип.

Класс String

Как уже указывалось, класс String занимает в Java особое положение. Экземпляры только этого класса можно создавать без использования ключевого слова new. Каждый строковый литерал порождает экземпляр String, и это единственный литерал (кроме null), имеющий объектный тип.

Затем значение любого типа может быть приведено к строке, применяя оператор конкатенации строк, который был рассмотрен для каждого типа, как примитивного, так и объектного.

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

String s="a";
s="b";

Во второй строке переменная сменила свое значение, но только создав новый объект класса String.

Поскольку каждый строковый литерал порождает новый объект, что есть очень ресурсоемкая операция в Java, то зачастую компилятор стремится оптимизировать эту работу.

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

String s1 = "abc";
String s2 = "abc";
String s3 = "a"+"bc";
print(s1==s2);
print(s1==s3);

Результатом будет:

true
true

То есть, в случае, когда строка конструируется из констант, известных уже на момент компиляции, оптимизатор также подставляет один и тот же объект.

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

String s1="abc";
String s2="ab";
print(s1==(s2+"c"));

Результатом будет false, так компилятор не может предсказать результат сложения значения переменной с константой.

В классе String определен метод intern(), который возвращает один и тот же объект-строку, для всех экземпляров, равных по значению. То есть, если для ссылок s1 и s2 верно выражение s1.equals(s2), то верно и s1.intern()==s2.intern().

Разумеется, в классе переопределены методы equals() и hashCode(). Метод toString() также переопределен, и возвращает он сам объект-строку, то есть для любой ссылки s типа String, не равной null, верно выражение s==s.toString().

Класс Class

Класс Class является метаклассом для всех классов Java. Когда JVM загружает файл .class, который описывает некоторый тип, в памяти создается объекта класса Class, который будет хранить это описание.

Например, если в программе есть строка:

Point p=new Point(1,2);

то это означает, что в системе созданы следующие объекты:

  1. собственно, объект типа Point, описывающий точку (1,2)
  2. объект класса Class, описывающий класс Point
  3. объект класса Class, описывающий класс Object. Так как класс Point наследуется от Object, описание этого класса также необходимо.
  4. объект класса Class, описывающий класс Class. Это обычный Java-класс, который должен быть загружен по общим правилам.

Одно из применений класса Class уже было рассмотрено - использование метода getClass() класса Object. Если продолжить последний пример с точкой:

Class cl=p.getClass(); // это объект №2 из списка
Class cl2=cl.getClass(); // это объект №4 из списка
Class cl3=cl2.getClass(); // опять объект №4

Выражение cl2==cl3 верно.

Другое применение класса Class также приводилось в примере применения технологии reflection. Кроме прямого использования метаклассса для хранения в памяти описания классов, Java использует эти объекты и для других целей, которые будут рассмотрены ниже (статические переменные, синхронизация статических методов и т.д.).

Если статья была Вам полезна, ставьте пальцы вверх и подписывайтесь. Оставляйте свои пожелания и вопросы в комментариях, с удовольствием отвечу.

#it #java #java для новичков #программирование