Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


 онструкторы. «арезервированные слова super и this. Ѕлоки инициализации




 ак уже говорилось, объекты в Java создаютс€ с помощью зарезервированного слова new, после которого идЄт конструктор Ц специальна€ подпрограмма, занимающа€с€ созданием объекта и инициализацией полей создаваемого объекта. ƒл€ него не указываетс€ тип возвращаемого значени€, и он не €вл€етс€ ни методом объекта (вызываетс€ через им€ класса когда объекта ещЄ нет), ни методом класса (в конструкторе доступен объект и его пол€ через ссылку this). Ќа самом деле конструктор в сочетании с оператором new возвращает ссылку на создаваемый объект и может считатьс€ особым видом методов, соедин€ющим в себе черты методов класса и методов объекта.

≈сли в объекте при создании не нужна никака€ дополнительна€ инициализаци€, можно использовать конструктор, который по умолчанию присутствует дл€ каждого класса. Ёто им€ класса, после которого став€тс€ пустые круглые скобки Ц без списка параметров. “акой конструктор при разработке класса задавать не надо, он присутствует автоматически.

≈сли требуетс€ инициализаци€, обычно примен€ют конструкторы со списком параметров. ѕримеры таких конструкторов рассматривались нами дл€ классов Dot и Circle.  лассы Dot и Circle были унаследованы от абстрактных классов, в которых не было конструкторов. ≈сли же идЄт наследование от неабстрактного класса, то есть такого, в котором уже имеетс€ конструктор (пусть даже и конструктор по умолчанию), возникает некотора€ специфика. ѕервым оператором в конструкторе должен быть вызов конструктора из суперкласса. Ќо его делают не через им€ этого класса, а с помощью зарезервированного слова super (от УsuperclassФ), после которого идЄт необходимый дл€ прародительского конструктора список параметров. Ётот конструктор инициализирует пол€ данных, которые наследуютс€ от суперкласса (в том числе и от всех более ранних прародителей). Ќапример, напишем класс FilledCircle -наследник от Circle, экземпл€р которого будет отрисовыватьс€ как цветной круг.

 

package java_gui_example;

import java.awt.*;

 

public class FilledCircle extends Circle{

 

/** Creates a new instance of FilledCircle */

public FilledCircle(Graphics g,Color bgColor, int r,Color color) {

super(g,bgColor,r);

this.color=color;

}

 

public void show(){

Color oldC=graphics.getColor();

graphics.setColor(color);

graphics.setXORMode(bgColor);

graphics.fillOval(x,y,size,size);

graphics.setColor(oldC);

graphics.setPaintMode();

}

 

public void hide(){

Color oldC=graphics.getColor();

graphics.setColor(color);

graphics.setXORMode(bgColor);

graphics.fillOval(x,y,size,size);

graphics.setColor(oldC);

graphics.setPaintMode();

}}

¬ообще, логика создани€ сложно устроенных объектов: родительска€ часть объекта создаЄтс€ и инициализируетс€ первой, начина€ от части, доставшейс€ от класса Object, и далее по иерархии, заканчива€ частью, относ€щейс€ к самому классу. »менно поэтому обычно первым оператором конструктора €вл€етс€ вызов прародительского конструктора super(список параметров), так как обращение к неинициализированной части объекта, относ€щейс€ к ведению прародительского класса, может привести к непредсказуемым последстви€м.

¬ данном классе мы примен€ем более совершенный способ отрисовки и Ускрывани€Ф фигур по сравнению с предыдущими классами. ќн основан на использовании режима рисовани€ XOR (Уисключающее илиФ). ”становка этого режима производитс€ методом setXORMode. ѕри этом повторный вывод фигуры на то же место приводит к восстановлению первоначального изображени€ в области вывода. ѕереход в обычный режим рисовани€ осуществл€етс€ методом setPaintMode.

 

¬ конструкторах очень часто используют зарезервированное слово this дл€ доступа к пол€м объекта, видимость имЄн которых перекрыта переменными из списка параметров конструктора. Ќо в конструкторах оно имеет ещЄ одно применение - дл€ обращени€ из одного варианта конструктора к другому, имеющему другой список параметров. Ќапомним, что наличие таких вариантов называетс€ перегрузкой конструкторов. Ќапример, пусть мы первоначально задали в классе Circle конструктор, в котором значение полей x, y и r задаЄтс€ случайным образом:

Circle(Graphics g, Color bgColor){

graphics=g;

this.bgColor=bgColor;

size=(int)Math.round(Math.random()*40);

}

“огда конструктор, в котором случайным образом задаютс€ значени€ полей x и y, а значение size задаЄтс€ через список параметров конструктора, можно написать так:

Circle(Graphics g, Color bgColor, int r){

this(g, bgColor);

size=r;

}

ѕри вызове конструктора с помощью слова this требуетс€, чтобы вызов this был первым оператором в реализации вызывающего конструктора.

¬ отличие от €зыка C++ в Java не разрешаетс€ использование имени конструктора, отличающегос€ от имени класса.

ѕор€док вызовов при создании объекта некого класса (будем называть его дочерним классом):

- —оздаЄтс€ объект, в котором все пол€ данных имеют значени€ по умолчанию (нули на двоичном уровне представлени€).

- ¬ызываетс€ конструктор дочернего класса.

-  онструктор дочернего класса вызывает конструктор родител€ (непосредственного прародител€), а также по цепочке все прародительские конструкторы и инициализации полей, заданных в этих классах, вплоть до класса Object.

- ѕроводитс€ инициализаци€ полей родительской части объекта значени€ми, заданными в декларации родительского класса.

- ¬ыполн€етс€ тело конструктора родительского класса.

- ѕроводитс€ инициализаци€ полей дочерней части объекта значени€ми, заданными в декларации дочернего класса.

- ¬ыполн€етс€ тело конструктора дочернего класса.

«нание данного пор€дка важно в случа€х, когда в конструкторе вызываютс€ какие-либо методы объекта, и надо быть уверенным, что к моменту вызова этих методов объект получит правильные значени€ полей данных.

 

 ак правило, дл€ инициализации полей сложно устроенных объектов используют конструкторы. Ќо кроме них в Java, в отличие от большинства других €зыков программировани€, дл€ этих целей могут также служить блоки инициализации класса и блоки инициализации объекта. —интаксис задани€ классов с блоками инициализации следующий:

 

ћодификаторы class »м€ ласса extends »м€–одител€ {

«адание полей;

static {

тело блока инициализации класса

}

 

{

тело блока инициализации объекта

}

 

«адание подпрограмм - методов класса, методов объекта, конструкторов

}

 

Ѕлоков инициализации класса и блоков инициализации объекта может быть несколько.

ѕор€док выполнени€ операторов при наличии блоков инициализации главного класса приложени€ (содержащего метод main):

- инициализаци€ полей данных и выполнение блоков инициализации класса (в пор€дке записи в декларации класса);

- метод main;

- выполнение блоков инициализации объекта;

- выполнение тела конструктора класса.

ƒл€ других классов пор€док аналогичен, но без вызова метода main:

- инициализаци€ полей данных и выполнение блоков инициализации класса (в пор€дке записи в декларации класса);

- метод main;

- выполнение блоков инициализации объекта;

- выполнение тела конструктора класса.

„ем лучше пользоватьс€, блоками инициализации или конструкторами? ќтвет, конечно, неоднозначен: в одних ситуаци€х Ц конструкторами, в других Ц блоками инициализации. ƒл€ придани€ начальных значений переменным класса в случа€х, когда дл€ этого требуютс€ сложные алгоритмы, можно пользоватьс€ только статическими блоками инициализации. ƒл€ инициализации полей объектов в общем случае лучше пользоватьс€ конструкторами, но если необходимо выполнить какой-либо код инициализации до вызова унаследованного конструктора, можно воспользоватьс€ блоком динамической инициализации.





ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2017-02-28; ћы поможем в написании ваших работ!; просмотров: 666 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

„тобы получилс€ студенческий борщ, его нужно варить также как и домашний, только без м€са и развести водой 1:10 © Ќеизвестно
==> читать все изречени€...

2232 - | 2107 -


© 2015-2024 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.015 с.