Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 57

Ильдар Шаукатович Хабибуллин

Отсюда вытекают другие особенности статических методов:

□ в статическом методе нельзя использовать ссылки this и super;

□ статические методы не могут быть абстрактными;

□ статические методы переопределяются в подклассах только как статические;

□ при переопределении статических методов полиморфизм не действует, ссылки всегда направляются на методы класса, а не объекта.

Именно по этим причинам в листинге 1.5 мы пометили метод f() модификатором static. Но в листинге 2.1 мы работали с экземпляром b2 класса Bisection2, и нам не потребовалось объявлять метод f () статическим.

Статические переменные инициализируются еще до начала работы конструктора, но при инициализации можно использовать только константные выражения. Если же инициализация требует сложных вычислений, например циклов для задания значений элементам статических массивов или обращений к методам, то эти вычисления заключают в блок, помеченный словом static, который тоже будет выполнен при загрузке класса, до конструктора:

static int[] a = new a[10]; static{

for (int k: a) a[k] = k * k;

}

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

Здесь внимательный читатель, наверное, поймал меня: "А говорил, что все действия выполняются только с помощью методов!" Каюсь: блоки статической инициализации и блоки инициализации экземпляра записываются вне всяких методов и выполняются до начала выполнения не то что метода, но даже конструктора.

Класс Complex

Комплексные числа широко используются не только в математике. Они часто применяются в графических преобразованиях, в построении фракталов, не говоря уже о фи-

зике и технических дисциплинах. Но класс, описывающий комплексные числа, почему-то не включен в стандартную библиотеку Java. Восполним этот пробел.

Листинг 2.4 длинный, но просмотрите его внимательно, при обучении языку программирования очень полезно чтение программ на этом языке. Более того, только программы и стоит читать, пояснения автора лишь мешают вникнуть в смысл действий (шутка).

Листинг 2.4. Класс Complex

class Complex{

private static final double EPs = 1e-12; // Точность вычислений. private double re, im; // Действительная и мнимая части.

// Четыре конструктора:

Complex(double re, double im){ this.re = re; this.im = im;

}

Complex(double re){this(re, 0.0);}

Complex(){this(0.0, 0.0);}

Complex(Complex z){this(z.re, z.im);}

// Методы доступа: public double getRe(){return re;} public double getIm(){return im;}

public Complex getZ(){return new Complex(re, im);} public void setRe(double re){this.re = re;} public void setIm(double im){this.im = im;} public void setZ(Complex z){re = z.re; im = z.im;}

// Модуль и аргумент комплексного числа: public double mod(){return Math.sqrt(re * re + im * im);} public double arg(){return Math.atan2(re, im);}

// Проверка: действительное число? public boolean isReal(){return Math.abs(im) < EPs;} public void pr(){ // Вывод на экран