KukuOne

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

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

Для обращения к отдельным символам надо использовать метод charAt(), у которого в качестве параметра (в скобках) указывается индекс символа в строковой переменной.

Приведем пример фрагмента класса:

String s;

int long;

s=reader.next();

long=s.length();

for (int i=0;i<long;i++)

System.out.print(s.charAt(i)+"#");

В случае, если с клавиатуры будет введено значение qwerty, на экран будет выведено:

q#w#e#r#t#y#

Еще раз: обратите внимание, что нумерация символов в строковом значении начинается с 0!


Раздел №6.
Присвоение данных между переменными разных типов (приведение типов, casting).
Специальные операторы.

В предыдущих разделах курса шла речь о том, что инициализацию переменных можно производить как прямым присваиванием значений (прямая инициализация), так и через использование уже инициализированных переменных (косвенная инициализация).

Приведем несколько примеров такой прямой и косвенной инициализации переменных:

Прямая инициализация Косвенная инициализация
int a=4; int a=6,b; b=a;
int b; b=-8; int x,y; x=-8; b=10*a;
int x=reader.nextInt(); int x=reader.nextInt(); y=-x;

Как правило, никаких проблем не возникает, когда прямая и косвенная инициализации производятся в рамках одного и того же типа переменных и типа данных. Иными словами, когда переменная типа "простое целое" (int) получает значение, лежащее в рамках диапазона этого типа (например, 8). Или – переменная типа "длинное десятичное" (double) получает, например, значение 5.7.

Думаем, что очень полезно в этом случае вновь продемонстрировать таблицу типов стандартных значений – мы приведем ее здесь еще раз.

Тип Пояснение Минимальное значение Максимальное значение
int "Простое" целое -2147483648  
long "Длинное" целое -922372036854775808  
float "Простое" десятичное 3,4e-38 3,4e38
double "Длинное" десятичное 1,7e-308 1,7e308
char Отдельный символ (знак) Пустое Один знак
String Строка (набор символов) Пустое Стандартно принято говорить о максимальном размере в 256 знаков. Однако в современных языках программирования это ограничение скорее теоретическое, так как обычно размер строки хранится в 32-битовом поле, что даёт максимальный размер строки в 4 294 967 295 байт (4 гигабайта).

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

В примерах достаточно ограничиться (для простоты) математическими типами из приведенной таблицы.

Перед вами пример объявления и инициализации переменной – возникает ли при этом конфликт?

int a = 100; long b = a;

long a=100; int b=a;

int x=21474836947;

int x=21474847;

Однако совершенно необязательно, чтобы к классе передача значений осуществлялась только и только между переменными одного и того же типа!

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

При этом, разумеется, происходит (или – должно быть произведено!) преобразование данных – такой процесс называется "приведением типов", (casting). Он может быть как неявным (фактически – автоматически производимым самим языком), так и явным, то есть требующим написания соответствующих операторов (подобно явному использованию оператора "плюс" (+) для вычисления суммы).

Неявное приведение типов (implicit) происходит, когда значение более узкого диапазона помещается в переменную более широкого диапазона.

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

Например, во множестве рациональных чисел есть множество целых чисел: то есть любое целое число формально можно записать как дробь, но не любую дробь можно записать как целое число.

Например, посмотрите на следующий фрагмент класса:

int a=4;

long b;

b=a;

Как видите, переменная типа "длинное целое" (long) может принимать значение типа "простое целое" (int) – это допустимо потому, что тип "простое целое" является внутренним подмножеством типа "длинное целое". Иными словами, подобное действие возможно потому, что любое значение типа "простое целое" находится внутри множества значений "длинное целое".

А вот наоборот – это не так; и именно потому, что это не так, для приведения типа "из подмножества в множество" (например, из типа long в тип int) требуются специальные, записываемые в явном виде, действия.

Явное (explicit) приведение типов требует использования специальных операторов.

Они представляют из себя описание типа, к которому (в который) надо выполнить приведение, заключенное в скобки и поставленное перед значением (или переменной), над которым (которой) надо выполнить действие приведения. Если попробовать сформулировать это правило максимально просто, то, видимо, один из возможных вариантом может выглядеть так: перед тем, что надо привести, следует в скобках указать тип, к которому надо привести.

Например: int x = (int)3957.229;

В этом примере значение множества "длинное десятичное" (десятичная дробь) заносится в переменную из "внутреннего подмножества" ("простое целое", int), для чего и используется указание на явное приведение в виде заключенного в скобки типа (int).

Разумеется, что в таком случае теряется часть значения (как правило, происходит понижение степени точности) – в приведенном примере переменная х будет иметь значение 3957.

Аналогично выполняется операция приведения с переменными:

double a=4.95;

int b=(int)a;

Кстати, можно выполнять явное приведение типов и для случаев, когда в этом нет необходимости – то есть когда язык Java может произвести неявное приведение.

Например:

double a=(double)4;

или

int a=4;

double b=(double)a;

Следует обязательно иметь в виду следующее ограничение, существующее в языке Java: все дробные значение язык автоматически относит к типу double, поэтому запись float a=4.95 считается ошибочной и требует выполнения явного приведения типа, то есть записи float a=(float)4.95

Операторы приведения типов окажутся особенно важными, когда потребуется подсчитать, например, среднее арифметическое двух целочисленных значений! Дело в том, что в этом случае мы снова сталкиваемся с необходимостью выполнить операцию деления – а она в языке Java требует быть чрезвычайно внимательным именно из-за использования разных типов.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: