Лекции (989962), страница 53
Текст из файла (страница 53)
Однако, болееоптимальное решение – это описать на уровне модуля private-переменную, а для чтения или записи еезначения использовать public-методы, называемые методами доступа. Метод доступа позволяет, передзаписью нового значения свойства, выполнить определенные действия: проверить значение свойства накорректность, автоматически пересчитать значения связанных свойств и т.д.
Пример:class Krug {private int radius;public void setRadius (int new_radius) {if (new_radius>0) {radius=new_radius;} else { System.out.println ("Некорректное значение радиуса"); }}public int getRadius ( ) { return ( radius ); } Ляхевич А.Г., 2000 - 2002 год}Конструкторы класса, перегрузка методов.Конструкторы класса – это специальные методы, которые вызываются при создании экземпляров классов.Обычно в этих методах содержатся операторы, которые позволяют проинициализировать значения свойствобъекта при его создании.
Для инициализации собственных свойств объекта используется ключевое словоthis (этот объект). Синтаксис: this.свойство = значение;Можно определять несколько конструкторов с различными наборами параметров. Тогда, присоздании экземпляра класса, будет возможность создавать объект, передавая ему различные наборыпараметров (перегружая конструкторы). При этом будет вызываться тот конструктор, у которого именнотакой набор параметров, который был указан при создании объекта. Перегружать можно не толькоконструкторы, но и любые методы класса.Имя конструктора должно совпадать с именем класса. Для конструктора не указывается типвозвращаемых им значений, т.к.
конструктор не может возвращать каких либо значений. Модификатордоступа конструктора всегда должен быть public. Конструкторы нельзя объявлять, как native, absract, static,synchronized или final. Пример:class Game {boolean vse_svoi; // Описание свойства "все свои"public Game (String Name) {this.vse_svoi=true; } /* инициализация свойства при создании объекта */public Game (int Chislo_igrokov) { this.vse_svoi=false; } /* инициализация свойства при создании объекта */public Game (String Name, int Chislo_igrokov) {/* операторы, выполняются при создании объекта */ }}Деструкторы класса (метод finalize)Метод finalize присутствует во всех объектах Java (он порожден от объекта java.lang.Object, от которогопорождены все объекты Java). Этот метод выполняется непосредственно перед "сборкой мусора", т.е. передтем, как объект будет уничтожен.
Пример:class Game {protected void finalize ( ) { System.out.println ("Игра окончена"); }}8.4. Создание экземпляра классаОписание класса – это просто описание свойств и методов объекта. При создании же экземпляра объекта(ключевое слово new), объект создается реально: анализируется описание класса, выделяется необходимаяпамять под объект, объект получает собственные копии всех не static свойств и методов класса и, в зависимости от переданных создаваемому классу параметров, срабатывает тот или иной конструктор класса,который выполняет заданные программистом операции по инициализации свойств объекта.
Можно создавать несколько экземпляров одного класса. При создании экземпляра класса, в используемые переменныепомещается указатель на созданный объект (см. переменные domino и shashki в примере ниже). На один итот же объект может существовать несколько указателей (см. переменную domino2 в примере ниже).Объект существует до тех пор, пока на него есть хотя бы одна ссылка, иначе он автоматически уничтожается Java ("сборка мусора").Синтаксис создания экземпляра класса следующий:Вариант 1 (предварительное описание, с последующим созданием):имя_описанного_класса имя_переменной;имя_переменной = new имя_описанного_класса (параметры_для_конструктора);Вариант 2 (создание в момент описания):имя_описанного_класса имя_переменной = new имя_описанного_класса (параметры_для_конструктора);Пример (предполагается, что класс Game описан раньше (см.
выше) ):public Class dvor {Game domino, domino2;// Описание переменных на уровне классаpublic dvor ( ) {//Конструктор класса dvordomino = new Game ("Домино", 6);/* Создается игра "домино" на 6 человек, срабатываетсоответствующий конструктор класса */Game shashki = new Game ("Шашки"); /* Создается игра "шашки", число участников и так известно.Т.к. список параметров другой, срабатывает конструктор, укоторого перечень параметров именно такой */domino2 = domino; /* За спинами доминошников появляются "болельщики", которые также лезут вигру – переменная domino2 указывает на тот же объект, что и domino.*/shashki = domino; /* В шашки играть бросают, и присоединяются к "болельщикам" доминошников:на объект "домино" уже 3 указателя: domino, domino2 и shashki, а объект"шашки" будет уничтожен при ближайшей "сборке мусора", т.к.
на него нетни одного указателя */} Ляхевич А.Г., 2000 - 2002 годpublic static void main(String args[ ] ) {// Выполнение программы всегда начинается с метода maindvor go = new dvor ( ); // Вызов конструктора dvor, который и выполнит основную часть программыSystem.gc ( ); // Принудительная "сборка мусора" ( gc = Garbage Collection )}}Приведенная выше программа начнет выполняться с метода main (как и любая исполняемая программа наJava), который вызовет создание экземпляра класса dvor. При создании экземпляра класса, будет вызванконструктор dvor ( ), который и выполнит основную часть программы. Такой прием применен из-за того,что метод main – статический, а из статического метода нельзя вызывать не статические методы и свойствадругих объектов (например, создавать объекты domino и shashki).8.5.
Наследование, переопределение методовМощной возможностью Java, как и любого объектно-ориентированного языка, является наследование. Принаследовании, порожденный класс получает свойства и методы того класса, от которого он был порожден, иих не надо переписывать заново. Кроме того, он может дополнительно определить свои собственныесвойства и методы, а также переопределить унаследованные методы (т.е. реализовать те же методы, но посвоему). Наследование задается при помощи ключевого слова extends в описании класса (синтаксис см.раньше). Переопределение унаследованных методов реализуется путем описания в порожденном классеметода с таким же именем, что и унаследованный метод.
После того, как метод переопределен, доступ кпервоначальному варианту возможен с использованием специальной переменной super ( доступ:super.метод_родителя или super.свойство_родителя ), которая указывает на класс, от которого был порожденданный. Ниже приведен пример, в котором от класса avtomobil порождается класс mercedes, в которомпереопределен метод poehal и создан новый метод marka. Причем метод poehal переопределен так, чтосначала вызывается старый вариант метода (super.poehal ( ) ), а затем добавляются новые команды. Крометого, предусмотрена возможность перегрузки метода, т.е. вызова одного и того же метода, с различнымивариантами параметров.
Пример:class avtomobil {long probeg;// Задаем свойство "пробег"void poehal ( ) { System.out.println (" Еду "); } // Задаем метод "поехал" }class mercedes extends avtomobil {// Объект mercedes порожден от avtomobil/* Свойство probeg определять не надо, т.к. оно унаследовано. Метод poehal также не надо было быопределять, но мы хотим заменить реализацию этого метод на свою, т.е. переопределить метод.Кроме того, мы создаем возможность перегружать метод poehal, описывая различные реализации этогометода для различных наборов параметров */void poehal ( ) {super.poehal( );System.out.println (" Еду быстро …"); }void poehal ( String kuda ) {super.poehal( );System.out.println (" Еду "+kuda); }void marka ( ) { System.out.println (" Шестисотый мерс!"); } //Задаем новый метод marka}public class proga {public proga( ) {mercedes myCar = new mercedes ( );myCar.marka ( ); myCar.poehal( ); myCar.poehal( " в клуб"); }public static void main(String args[ ] ) { proga go = new proga (); }}8.6.
Создание иерархии объектов.Необходимо отличать наследование, от создания иерархии объектов. Принаследовании, порожденный класс получает набор свойств и методов откласса, от которого происходит наследование. Таким образом, эти два классаимеют много общего. При создании иерархии объектов, вышестоящий иподчиненный объекты могут не иметь ничего общего, но один объект подчиПодчиненный объектняется другому, т.е. доступ к свойствам и методам подчиненного объектавозможен через свойство вышестоящего объекта. Проводя аналогию с жизнью: сын похож на отца, ноначальник и подчиненный не обязательно из одной семьи.
Хочется также подчеркнуть уже прозвучавшуюразницу: наследование – для классов, иерархия – для объектов, т.е. для экземпляров класса. Иерархиязадается путем описания в классе вышестоящего объекта свойства, создающего подчиненный объект, вклассе которого может быть также описано свойство, создающее объект еще более низкого уровня иерархиии т.д.
Тогда, создав вышестоящий объект, вы автоматически создаете дерево подчиненных объектов. Впримере ниже, описан объект mercedes, который содержит подчиненный объект koleso (свойство osi),Вышестоящий объект Ляхевич А.Г., 2000 - 2002 годкоторый, в свою очередь, содержит подчиненный объект болт (свойство zaklepki). При создании автомобиляавтоматически создаются колеса и болты. Доступ к подчиненным объектам происходит в формате:вышестоящий_объект . подчиненный_объект . свойства_подчиненного_объекта.package primer;class avtomobil {long probeg = 3;void poehal ( ) { System.out.println (" Еду "); }}class mercedes extends avtomobil {// Наследование от класса avtomobilvoid poehal ( ) { System.out.println (" Еду быстро "); }void marka ( ) { System.out.println (" Шестисотый мерс!"); }koleso osi = new koleso ();// Создание подчиненного объекта}class koleso {boolean zapaska=false;// Описание обычного свойства "запаска"bolt zaklepki = new bolt();// Создание подчиненного объекта}class bolt { int nomer_bolta = 100; }public class proga {mercedes myCar; // Описание переменной myCarpublic proga() {myCar = new mercedes ( ); // Создание вышестоящего объектаmyCar.marka ( );// Использование метода вышестоящего объектаmyCar.osi.zapaska = true; // Использование свойства объекта второго уровня иерархииmyCar.osi.zaklepki.nomer_bolta = 1; // Использование свойства объекта третьего уровня иерархии}public static void main(String args[ ] ) { // Запуск программыproga go = new proga ();}}8.7.