[Java] Урок 2.5. Приведение типов
В Java автоматическое преобразование возможно только в том случае, когда точности представления чисел переменной-приемника достаточно для хранения исходного значения. Такое преобразование происходит, например, при занесении значения переменной типа byte
или short
в переменную типа int
. Это называется расширением (widening) или повышением (promotion), поскольку тип меньшей разрядности расширяется (повышается) до большего совместимого типа. Размера типа int
всегда достаточно для хранения чисел из диапазона, допустимого для типа byte
, поэтому в подобных ситуациях оператора явного приведения типа не требуется.
Для занесения значения типа int
в переменную типа byte
необходимо использовать оператор приведения типа. Эту процедуру иногда называют сужением (narrowing), поскольку вы явно сообщаете транслятору, что величину необходимо преобразовать, чтобы она уместилась в переменную нужного вам типа. Для приведения величины к определенному типу перед ней нужно указать этот тип, заключенный в круглые скобки.
int a = 100; byte b = (byte) a;
Автоматическое преобразование типов
При вычислении выражения, точность, требуемая для хранения промежуточных результатов, зачастую должна быть выше, чем требуется для представления окончательного результата.
byte a = 40; byte b = 50; byte с = 100; int d = a * b / с;
Результат промежуточного выражения (а* b) вполне может выйти за диапазон допустимых для типа byte
значений. Именно поэтому Java автоматически повышает тип каждой части выражения до типа int
, так что для промежуточного результата (а * b) хватает места.
Автоматическое преобразование типа иногда может оказаться причиной неожиданных сообщений транслятора об ошибках. Например, показанный ниже код, хотя и выглядит вполне корректным, приводит к сообщению об ошибке на фазе трансляции. В нем мы пытаемся записать значение 50 * 2, которое должно прекрасно уместиться в тип byte
, в байтовую переменную. Но из-за автоматического преобразования типа результата в int
мы получаем сообщение об ошибке от транслятора — ведь при занесении int
в byte
может произойти потеря точности.
byte b = 50; b = b * 2;
Правильно:
byte b = 50; b = (byte) (b* 2);
Если в выражении используются переменные типов byte
, short
и int
, то во избежание переполнения тип всего выражения автоматически повышается до int
. Если же в выражении тип хотя бы одной переменной — long
, то и тип всего выражения тоже повышается до long
.
Если выражение содержит операнды типа float
, то и тип всего выражения автоматически повышается до float
. Если же хотя бы один из операндов имеет тип double
, то тип всего выражения повышается до double
.
По умолчанию Java рассматривает все числа с плавающей точкой, как имеющие тип double
.
Т.е. в этом случае будет ошибка:
float f = 0.1;
Надо:
float f = 0.1f;
Символы
Поскольку в Java для представления символов в строках используется кодировка Unicode, разрядность типа char
в этом языке — 16 бит. Диапазон типа char
— 0..65536.
char c; char c2 = Oxf132; char c3 = ' a'; char c4 = '\n';
Хотя величины типа char
и не используются, как целые числа, можно оперировать с ними так, как если бы они были целыми. Это дает возможность сложить два символа вместе, или инкрементировать значение символьной переменной.
int three = 3; char one = '1'; char four = (char) (three + one);
В результате выполнения этого кода в переменную four
заносится символьное представление цифры — '4'.
[Java] Урок 2. Массивы
Объявление целочисленного массива:
int month_days [];
Это просто указатель и пока его использовать нельзя.
Для использования его надо выделить память:
month_days = new int[12];
Другой вариант:
int month_days [] = new int[12];
Массивы в Jave по умолчанию инициализированы нулями.
Массив можно сразу заполнить нужными данными:
int month_days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
Размер будет вычислен автоматически.
Для получения размера массива используется встроенный метод length
. Индексация элементов идет с 0.
for(int i = 0; i < month_days.length; i++) { System.out.print(month_days[i] + " "); }
Многомерные массивы
Вообще, это не совсем многомерные массивы. Это массивы массивов.
Массив из 16 элементов:
double matrix [][] = new double [4][4];
Но можно и вот так:
double matrix [][] = new double [4][]; matrix[0] = new double[4]; matrix[1] = new double[5]; matrix[2] = new double[8]; matrix[3] = new double[2];
Печатаем:
for(int i = 0; i < matrix.length; i++) { for(int j = 0; j < matrix[i].length; j++) { System.out.print(matrix[i][j] + " "); } System.out.println(); }
Получаем:
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Инициализация двумерного массива:
int faa[][] = {{1,2,3},{4,5,6,7},{8,9,0,0,2}};
Тонкость.
Если есть желание задать значения массиву внутри массива, то вот так работать не будет:
double matrix [][] = new double [4][]; matrix[0] = {1., 2., 3.}; ...;
Надо обязательно выделять память вручную:
matrix[0] = new double[]{1., 2., 3.};
[ООП] Некоторые определения
По просьбе.
Материал выискивался как подготовка к Гос. экзаменам и представляет собой компиляцию кучи источников. Посему их не указываю.
Некоторые вещи были взяты у Гради Буча "Объектно-ориентированный анализ и проектирование"
[Java] Шпаргалка 1
- Ключевые и зарезервированные слова языка
- Типы данных
- Имена переменных
- Ссылки
[SQL] Простенький бекап для SQLite
Для бекапа средствами SQL, а не самого SQLite'а можно сделать вот так:
//Подсоединяем файл БД, куда будем делать копию: ATTACH DATABASE 'C:\file.db' AS fileDB; //Создаём там таблицу путем копирования содержимого: CREATE TABLE fileDB.qdn AS select * FROM table_name; //Отсоединяемся: DETACH fileDB;
[UX] Артуро Толедо — 24 недели Metro-дизайна для Windows Phone
Оригиналы (англ.) - http://ux.artu.tv/
Перевод первых трёх статей
Принципы
Процесс проектирования приложений
Формирование идей и концепции
Статьи вообще направлены на Metro, как не трудно догадаться, но могут быть использованы и для разработки интерфейсов вообще.
Первые три статьи как раз описывают общие принципы практически без перехода к конкретике.
[SQL] Задачка соискателю
Тема: SQL дерево.
Задача: дана одна сущность с замыканием ключа сам на себя - найти все листья
Таблица:
CREATE TABLE t1 (id integer NOT NULL PRIMARY KEY UNIQUE, id_p integer)
Решение:
SELECT * FROM t1 AS e1 WHERE NOT EXISTS (SELECT * FROM t1 AS e2 WHERE e1.id = e2.id_p)
Т.е. ищем все элементы которые не являются родителем кому-либо
[Android NDK] Unable to find native library
Пытаясь собрать пример из NDK получаю вот такую ошибку:
Caused by: java.lang.IllegalArgumentException: Unable to find native library: native-activity
Весь интернет пишет какую-то ересь типа:
"Поправьте в AndroidManifest.xml строчку android:hasCode="false" на android:hasCode="true" и будет вам счастье"
А вот хер! Никакого эффекта.
Так бы и закончилось моё желание писать на С++ под Дроида, но тут я натыкаюсь на отличную ссылочку:
http://mobilepearls.com/labs/ndk-builder-in-eclipse/
Получается, что проблема в самом Эклипсе, блин.
Коротко:
1. Заходим в Properties проекта в раздел Builders. Жмём New...
2. Выбираем тип Program и жмём Ok
3. Location указываем путь до ndk-builer'а (я указал абсолютный путь. Под Вин это звучит так: <путь в системе>\android-ndk-r8\ndk-build.cmd)
4. Working directory - путь до папки с проектом (Моё: <путь в системе>\android-ndk-r8\samples\native-activity
5. На том же окошке переходим во вкладку Refresh, ставим галочку и выбираем Specific resources. Разворачиваем проект и ставим галочку на lib. Finish
6. Вкладка Build Options. Проверяем наличие галочки на During auto builds и ставим галку на Specify working set of relevant resources. Разворачиваем проект и ставим галочку на jni
7. Жмем Apply, Ok, Ok
Не забываем нажать Project/Clean
Всё, теперь проект запускается без ошибок.
Пара инструментов
1. Пиксель-арт тайлсет редактор - http://pyxeledit.com/
2. Проектирование интерфейса мобильного приложения - http://www.fluidui.com/
Работает только под Сафари и Хромом. Так что может быть, когда нибудь.