Явная инициализация статических членов




Язык Java позволяет сгруппировать несколько действий по инициализации объектов static в специальной конструкции, называемой статическим блоком.

Выглядит это примерно так:

public class A {

static int i;

static float n;

static {

i = 47;

n = 10.1;

}

}

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

Инициализация нестатических данных экземпляра

В Java имеется сходный синтаксис для инициализации нестатических переменных для каждого объекта. Вот пример:

class A {

A () { System.out.println("конструктор А"); }

}

class B {

B () { System.out.println("конструктор B"); }

}

class Test {

Test () { System.out.println("конструктор Test"); }

{ // это блок инициализации экземпляра

// выполняется до любого конструктора

A objA = new A();

B objB = new B();

System.out.println ("objA & objB инициализированы");

}

public static void main(String[] args) {

Test objTest = new Test();

}

}

 

Получим:

конструктор А

конструктор B

objA & objB инициализированы

конструктор Test

 

Секция инициализации экземпляра выглядит в точности так же, как и конструкция static-инициализации, разве что ключевое слово static отсутствует. Такой синтаксис необходим для поддержки инициализации анонимных внутренних классов (будет пройдено ниже), но он также гарантирует, что некоторые операции будут выполнены независимо от того, какой именно конструктор был вызван в программе. Из результатов видно, что секция инициализации экземпляра выполняется раньше любых конструкторов.

Управляющие конструкции

Условная конструкция

Команда if-else является, наверное, наиболее распространенным способом передачи управления в программе. Присутствие ключевого слова else не обязательно, поэтому конструкция if существует в двух формах:

if(логическое выражение)

команда или блок команд

и

if(логическое выражение)

команда или блок команд

else

команда или блок команд

 

Условие должно дать результат типа boolean. Если результат true, тогда команда или блок команд выполняется, если же false, то не выполняется и управление передается далее. В секции команда располагается либо простая команда, завершенная точкой с запятой, либо составная конструкция из команд, заключенная в фигурные скобки.

Пример:

int result = 0;

void test(int testval, int target) {

if(testval > target)

result = +1;

else if(testval < target)

result = -1;

else {

result = 0;

System.out.print("Числа равны");

}

}

Циклы

Конструкции while, do-while и for управляют циклами и иногда называются циклическими командами. Команда повторяется до тех пор, пока управляющее логическое выражение не станет ложным.

Форма цикла while следующая:

 

while (логическое выражение)

команда или блок команд

 

Логическое выражение вычисляется перед началом цикла, а затем каждый раз перед выполнением очередного повторения оператора.

 

Форма конструкции do-while такова:

 

do

команда или несколько команд

while (логическое выражение);

 

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

 

Цикл for проводит инициализацию перед первым шагом цикла. Затем выполняется проверка условия цикла, и в конце каждой итерации осуществляется некое «приращение» (обычно изменение управляющей переменной). Цикл for записывается следующим образом:

 

for (инициализация; логическое выражение; шаг)

команда или блок команд

 

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

 

Пример:

for(int i = 1, j = i + 10; i < 5; i++, j = i * 2) {

//...

}

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

Задача. Вывести 5 раз на экран в столбик цифру 20.

int i = 0; while (i < 5) { System.out.println(20); i++; } int i = 0; do System.out.println(20); i++; while (i < 5);   for (int i = 0; i < 5; i++) System.out.println(20);   /* область действия переменной i – тело цикла */

 

Foreach

В Java SE5 появилась новая, более компактная форма for для перебора элементов массивов и контейнеров (см. далее). Эта упрощенная форма, называемая синтаксисом foreach, не требует ручного изменения служебной переменной для перебора последовательности объектов — цикл автоматически представляет очередной элемент.

Следующая программа создает массив float, после чего перебирает все его элементы:

import java util.*;

public class ForEachFloat {

public static void main(String[] args) {

Random rand = new Random(47);

float f[] = new float[10];

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

f[i] = rand.nextFloat();

for(float x: f)

System.out.println(x);

}

}

 

 



Поделиться:




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

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


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