Сертификация Java
А вот тут можно попробовать пройти тестовый экзамен на сертификат http://www.certpal.com
Правда, он старенький, кажется.
[Java] Классы. static и abstract
static
Иногда требуется создать метод, который можно было бы использовать вне какого-либо объекта.
Статические методы могут непосредственно обращаться только к другим статическим методам, в них ни в каком виде не допускается использование ссылок this
и super
.
Внутри статических методов недопустимы ссылки на не статические переменные объекта.
Переменные также могут иметь тип static
, они подобны глобальным переменным, то есть доступны из любого места кода.
class Static { static int a = 3; static int b = 4; static void method(int x) { System.out.println("x = " + x); System.out.println("a = " + a); System.out.println("b = " + b); } }
Вызываем без создания экземпляра класса
Static.method(42); System.out.println("StaticClass.b = " + Static.b);
Результат запуска этой программы
x = 42 a = 3 b = 4 StaticClass.b = 4
abstract
Бывают ситуации, когда нужно определить класс, в котором задана структура какой-либо абстракции, но полная реализация всех методов отсутствует. В таких случаях вы можете с помощью модификатора типа abstract
объявить, что некоторые из методов обязательно должны быть замещены в подклассах. Любой класс, содержащий методы abstract
, также должен быть объявлен, как abstract
. Поскольку у таких классов отсутствует полная реализация, их представителей нельзя создавать с помощью оператора new
. Кроме того, нельзя объявлять абстрактными конструкторы и статические методы. Любой подкласс абстрактного класса либо обязан предоставить реализацию всех абстрактных методов своего родителя, либо сам должен быть объявлен абстрактным.
abstract class A { abstract void callme(); void metod() { System.out.println("Inside A's metoo method"); } } class B extends A { void callme() { System.out.println("Inside B's callme method"); } } class Abstract { public static void main(String args[]) { B b = new B(); b.callme(); b.metoo(); } }
[Java] Классы. Перегрузка, this, наследование, переопределение
- Перегрузка методов
- Оператор this
- Наследование
- Переопределение методов (
override
) - Всякое
- Непонятные возможности
[Java] Сортировка пузырьком
Теории уже достаточно для того, чтобы начать делать всякое.
Попробуем реализовать простейшую сортировку.
Что такое сортировка пузырьком?
Это когда последовательно берется каждый элемент массива и "всплывается" на своё место пока не встретит более "легкий" элемент или конец массива.
Что для этого надо?
Для начала, нужно проходить по всему массиву:
for(int i = 0; i < arr.length; i++)
Ничего сложного, да?
Теперь надо каждый найденный элемент поднимать вверх.
for(int i = 1; i < arr.length; i++) //внимание на начальный номер //связано это с тем, что сравниваем с "предыдущим" пузырьком //но индекса "-1" в массиве нет { for(int j = i; j >= 1; j--) { //меняем элементы местами int a = arr[j]; arr[j] = arr[j-1]; arr[j-1] = a; } }
Элементы "всплывают". Но чего-то не хватает... Точно, проверки - нужно ли вообще всплывать!
for(int i = 1; i < arr.length; i++) { for(int j = i; (j >= 1) && (arr[j] < arr[j - 1]); j--) //ПОКА (arr[j] меньше arr[j-1]) И (в массиве еще есть элементы (j >= 0)) { int a = arr[j]; arr[j] = arr[j-1]; arr[j-1] = a; } }
Вот так вот.
Массив для проверки можно создать так:
int arr[] = {4, 7, 2, 9, 0, 1, 9, 12 ,56 ,78};
Но мы жешь программисты!
Так что воспользуемся готовой функцией random!
int arr[] = new inr[10]; for(int i = 0; i < arr.length; i++) arr[i] = Math.random();
В качестве домашнего задания попробуйте реализовать сортировку по убыванию.
Ну и на сложное - Гномью сортировку (gnome sort)
[Java] Урок 5. Классы. Введение
- Схема класса
- Оператор
new
- Методы
- Вызов метода
[Java] Урок 4. Циклы
- while
- do-while
- for
- Немного дзена
- Оператор запятая
- Оператор
continue
- Оператор
return
[Java] Шпаргалка 2. Операторы
- Арифметические операторы
- Целочисленные битовые операторы
- Булевы логические операторы
- Операторы отношений
- Тернарный оператор if-then-else
- Приоритет операций
[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'.