Класс 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);
то это означает, что в системе созданы следующие объекты:
- собственно, объект типа Point, описывающий точку (1,2)
- объект класса Class, описывающий класс Point
- объект класса Class, описывающий класс Object. Так как класс Point наследуется от Object, описание этого класса также необходимо.
- объект класса 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 для новичков #программирование