Объекты класса String


Работа с текстом

В некоторых примерах из предыдущих глав текст уже использовался. По крайней мере, мы имели дело с текстовыми литералами — собственно текстом, заключенным в двойные кавычки. В Java текст — это объект. Для работы с текстом служат два встроенных Java-класса: String и StringBuffer. Поэтому с формальной точки зрения создание текста сводится к созданию объекта одного из этих классов. В этой главе рассмотрены оба эти класса. Каждый из них имеет свои особенности, хотя у них больше сходств, чем различий. Главное принципиальное различие состоит в том, что объекты класса String изменять нельзя, а объекты класса StringBuffer — можно. По большому счету, содержание этой главы ограничивается описанием свойств и возможностей классов String и StringBuffer.

Кроме этого, в конце главы кратко описываются способы обработки аргументов командной строки.

Классы String и StringBuffer определены в базовом пакете java.lang, который доступен по умолчанию, поэтому для создания объекта класса String или StringBuffer импорт пакетов выполнять не нужно. Оба класса определены как неизменяемые (final), то есть они не могут быть суперклассами для наследования.

 

Объекты класса String

Один из способов создания «текстовой переменной» подразумевает создание объекта класса String. Чтобы создать объект класса, необходимо, как минимум, знать, какие у этого класса есть конструкторы. Что касается класса String, то имеет смысл выделить следующие конструкторы.

  • Конструктор создания пустой строки. В этом случае конструктору аргументы не передаются. Пример команды создания объекта класса String со значением в виде пустой строки имеет вид:

String s=new String();

  • Конструктор создания текстовой строки на основе символьного массива.

В этом случае аргументом конструктору передается имя массива символов. Результатом является текст, составленный из всех символов массива в порядке их размещения в массиве. Пример создания текстовой строки на основе символьного массива:

char symbols[]={'a','b','c'};

String s=new String(symbols);

В этом конструкторе, помимо имени массива, можно указать индекс элемента массива, начиная с которого будет извлекаться строка, а также длину строки в символах. Например, так:

char symbols={'a','b','c','d','e','f'};

String s=new String(symbols,2,3); // s="cde"

  • Конструктор копирования объекта . Аргументом конструктора указывается переменная текстового типа, ссылающаяся на уже существующий текстовый объект или текстовый литерал. В результате создается новый объект с таким же текстовым значением, как и исходный. Например:

String obj=new String("Текстовая строка");

String s=new String(obj);

Это — далеко не весь список доступных конструкторов. В частности, существует конструктор, принимающий в качестве аргумента массив типа byte с кодами римасимволов, которые автоматически преобразуются в буквы, а буквы — в текст.

В этом конструкторе также можно указывать второй и третий аргументы — соответственно начальный индекс элемента массива, с которого начинается формирование текстовой строки, и длину строки в символах.

В листинге 1 приведен простой пример создания текстовой строки на основе символьного массива, а также на основе уже существующего текстового объекта.

Листинг 1.Создание текстовой строки на основе символьного массива

class MakeString{

public static void main(String args[]){

char symbs[]={'J','a','v','a'};

String strA=new String(symbs);

String strB=new String(strA);

System.out.println(strA);

System.out.println(strB);}

}

В результате выполнения этой программы на экран дважды выводится слово Java. Пример этот очень простой: сначала создается символьный массив symbs, затем на его основе создается текстовая строка strA, после чего создается еще одна текстовая строка strB с таким же значением (слово Java), как и строка strA.

Обращаем внимание, что в данном случае объектные переменные strA и strB класса String ссылаются на разные объекты, но текстовые значения в этих объектах записаны одинаковые.

По-иному обстояли бы дела, если одной объектной переменной, например srtA, в качестве значения была присвоена другая объектная переменная (команда вида strA=strB). В последнем случае обе переменные ссылались бы на один и тот же объект. В рассмотренном примере объекты разные. Еще один способ создания текстовой строки проиллюстрирован в листинге 2.

Здесь текстовая строка создается на основе числового массива. Каждое число в массиве элементов типа byte интерпретируется как код символа в кодировке ASCII.

Листинг 2.Создание текстовой строки на основе числового массива

class SubStringConstr{

public static void main(String args[]){

byte ascii[]={65,66,67,68,69,70};

String strBig=new String(ascii);

System.out.println(strBig);

String strSmall=new String(ascii,2,3);

System.out.println(strSmall);}

}

Создаются две строки, обе на основе массива ascii. В первом случае используется весь массив — он передается аргументом конструктору класса String. Во втором случае извлекается только часть массива: три элемента, начиная с элемента с индексом 2 (здесь нелишне напомнить, что индексация элементов массива начинается с нуля). Результат выполнения программы следующий:

ABCDEF

CDE

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

текст, необходимо создавать новый объект. Некоторые методы, с помощью которых выполняется обработка текстовых строк, рассматриваются в следующих разделах этой лекции.

Бывает важно знать длину текстовой строки (в символах). Для определения длины строки, записанной в текстовом объекте, используют метод length(). Этот метод вызывается из объекта, для которого определяется длина строки. Например, если str является объектом класса String, то определить длину текстовой строки, на которую ссылается объектная переменная str, можно командой str.length(). Более того, текстовые литералы в Java реализуются в виде объектов класса String. Это означает, что метод length() также может быть вызван и из текстового литерала. В этом смысле вполне корректной является, например, следующая команда (результат равен 12):

"Всем привет!".length()

Что касается базовых операций, то по отношению к текстовым строкам можно применять только операцию сложения (с оператором +), которая интерпретируется как объединение (конкатенация) соответствующих строк. Пример конкатенации текстовых строк:

String str="Евгению Петрову "+18+" лет.";

В результате получаем текст "Евгению Петрову 18 лет.". Если при сложении кроме текстовых операндов присутствуют и операнды других типов (например, числа), то выполняется их автоматическое приведение к текстовому формату (преобразование в объект типа String). При этом могут складываться довольно неожиданные ситуации. Например:

String str="Число три: "+1+2;

В результате выполнения этой команды текст, записанный в объект класса String, на который ссылается переменная str, получается таким: "Число три: 12".

Причина кроется в способе вычисления выражения "Число три: "+1+2. Поскольку в нем кроме двух числовых операндов 1 и 2 присутствует еще и текстовый операнд "Число три: ", причем в выражении он идет первым, а выражение вычисляется слева направо, то к тексту "Число три: " добавляется (объединение строк) текстовое значение "1", после чего к полученному тексту добавляется текстовое значение "2". Чтобы предотвратить такое экзотическое сложение, вместо приведенной нужно воспользоваться командой:

String str="Число три: "+(1+2);

Здесь с помощью скобок изменен порядок вычисления выражения: сначала вычисляется сумма чисел, а уже после этого полученное число преобразуется в текстовый формат. В результате переменная str ссылается на текст "Число три: 3".

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

Правила преобразования объекта в текстовый формат в этом случае определяются методом toString(). В силу особой важности этого метода, рассмотрим его отдельно.

В завершение раздела сделаем несколько замечаний относительно реализации команды вида

String str="Текст";

Формально результатом команды является создание объектной переменной str типа String, которая ссылается на текст "Текст". На первый взгляд кажется, что такой способ создания текстового объекта отличается от рассматривавшихся ранее. Однако это не совсем так, особенно если учесть, что в Java текстовые литералы являются объектами класса String.

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

String str;

str="Текст";

Первой командой объявляется объектная переменная str класса String. Даже если нет объекта, объектную переменную объявить можно. Напомним, что значением объектной переменной является ссылка на объект соответствующего класса.

Значение объектной переменной присваивается второй командой. Поскольку текстовый литерал "Текст" является объектом класса String, ссылка на этот объект командой str="Текст" присваивается переменной str. Сам же объект текстового литерала создается автоматически, программисту в этом процессе принимать участия не нужно — достаточно, чтобы тестовый литерал появился в программном коде.

 

Метод toString()

Метод toString() определен в классе Object, находящемся на вершине иерархии классов Java (это общий суперкласс Java). Метод вызывается по умолчанию при преобразовании объекта в текстовый формат. Благодаря тому, что метод можно перегружать, открывается целый ряд достаточно интересных возможностей. Рассмотрим их.

Для перегрузки метода toString(), как минимум, необходимо знать его сигнатуру. Метод в качестве значения возвращает объект класса String и не имеет аргументов. Как отмечалось, метод вызывается по умолчанию при преобразовании объекта в текстовый тип. Примеры таких ситуаций: сложение объекта с текстовой строкой или использование объекта в качестве аргумента метода println().

Самый простой и наглядный способ познакомиться с методикой переопределения и использования метода toString() — рассмотреть пример. Обратимся к листингу 3.

Листинг 3.Переопределение метода toString()

class ComplNums{

// Поля класса:

double Re;

double Im;

// Конструктор:

ComplNums(double x,double y){

Re=x;

Im=y;}

// Переопределение метода toString():

public String toString(){

String result="",sign="",ImPart="",RePart="";

if(Re!=0||(Re==0&&Im==0)) RePart+=Re;

if((Im>0)&&(Re!=0)) sign+="+";

if(Im!=0) ImPart+=Im+"i";

result=RePart+sign+ImPart;

return result;}

}

class toStringDemo{

public static void main(String[] args){

for(int i=1;i<=3;i++){

for(int j=1;j<=5;j+=2){

ComplNums z=new ComplNums(i-2,j-3);

// Автоматический вызов метода toString():

System.out.println(z);

}

}

}

}

В программе создается некое подобие класса для реализации комплексных чисел. У класса ComplNums два поля Re и Im типа double. Это действительная и мнимая части комплексного числа. Конструктор класса принимает два аргумента — значения полей Re и Im. Кроме этого, в классе переопределен метод toString(). Метод, описанный как public, возвращает в качестве значения объект класса String и не имеет аргументов. На метод toString() возложена обязанность сформировать текстовое представление комплексного числа с заданными действительной и мнимой частями. Правила представления комплексного числа следующие.

Если действительная часть равна нулю, а мнимая отлична от нуля, то действительная часть не отображается.

Если и мнимая, и действительная части числа равны нулю, отображается ‰действительная (нулевая) часть.

Если действительная часть отлична от нуля, а мнимая равна нулю, мнимая ‰часть не отображается.

Если действительная часть не отображается, то не отображается и знак плюс ‰перед мнимой частью.

Программный код метода toString() с помощью нескольких условных инструкций реализует эти правила. В частности, результат метода предварительно записывается в объектную переменную result класса String. Переменная result, в свою очередь, представляется как объединение трех текстовых строк: RePart (текстовое представление действительной части комплексного числа), ImPart (текстовое представление мнимой части комплексного числа с учетом мнимой единицы i) и sign (знак между действительной и мнимой частями комплексного числа). Все четыре переменные инициализируются пустой строкой.

Командой if(Re!=0||(Re==0&&Im==0)) RePart+=Re изменяется, если необходимо, текстовое представление действительной части. Это происходит, если действительная часть отлична от нуля или если и действительная, и мнимая части равны нулю.

Командой if((Im>0)&&(Re!=0)) sign+="+" определяется текстовое представление для знака перед мнимой частью. Это плюс, если мнимая часть положительна, а действительная отлична от нуля. В противном случае значение переменной sign остается неизменным, а знак минус автоматически добавляется в текстовое представление мнимой части за счет отрицательного поля Im.

Текстовое представление для мнимой части определяется командой

if(Im!=0)

ImPart+=Im+"i".

В представление мнимой части, кроме числового значения, добавляется текстовое представление мнимой единицы "i". Мнимая часть отображается, если она отлична от нуля.

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

Результат выполнения программы имеет вид:

-1.0-2.0i

-1.0

-1.0+2.0i

-2.0i

0.0

2.0i

1.0-2.0i

1.0

1.0+2.0i

Обращаем внимание на способ отображения текстового представления объекта z. Используется команда System.out.println(z), то есть объект указывается аргументом метода println(). Метод toString() вызывается автоматически при попытке преобразовать объект z в текстовый формат (в объект класса String).

Переопределение метода toString() — очень удобный прием, который позволяет экономить не только усилия по реализации вывода информации об объектах на экран, но и создавать компактные и продуктивные программы.

 



Дата добавления: 2016-06-22; просмотров: 1928;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.021 сек.