it_vse (519823), страница 52
Текст из файла (страница 52)
Таким образом, команда Massiv [ 3 ] [ 3 ] = 4;присваивает значение элементу массива, находящемся в 4-ой строке и 4-ом столбце.Объявление массива с заданием первоначальных значений:Синтаксис: модификатор_доступа тип_данных имя_массива [ ] = {значение1, значение2, значениеN};Пример:int Massiv [ ] = {123,17,29,15 };// одномерный массив Ляхевич А.Г., 2000 - 2002 годpublic long Massiv [ ] [ ] = { {123,17,29,15 }, {17, 12, 3} }; // двумерный массивОбъявление массива, с последующим его созданием:Синтаксис: модификатор_доступа тип_данных имя_массива [ ];имя_массива = new тип_данных [ число_элементов ];Пример:private int Massiv [ ];// одномерный массивMassiv = new int [ 4 ];long Massiv [ ] [ ];// двумерный массивMassiv = new long [ 4 ] [ 3 ];Объявление массива, одновременно с его созданием:Синтаксис: модификатор_доступа тип_данных имя_массива [ ] = new тип_данных [ число_элементов ];Пример:int Massiv [ ] = new int [ 4 ];// одномерный массивprivate protected long Massiv [ ] [ ] = new long [ 4 ] [ 3 ];// двумерный массив8.3.
Методы класса, методы доступа в классах, конструкторы и деструкторы класса.Объявление методаСинтаксис:модификатор_доступа спецификаторы тип_возвращаемого_значения имя__метода (параметры) throwsсписок_исключений_которые_вызывает_класс{ /* операторы */return возращаемое_значение ; }Пример:1) public static long Metod (int x, byte y) throws IOException { /*операторы*/ return 5; }2) void Metod ( ) { /*операторы*/ return; /*операторы*/}* Во втором примере тип_возвращаемого_значения = void. Тип void – это "пустой" тип, что означает, чтометод не возвращает значений. При указании типа void, ключевое слово return указывается без параметров(или вообще не используется) и просто означает преждевременный выход из метода.Модификаторы доступа методов (нет, public, protected, private) – см. модификаторы доступа свойств.Спецификаторы методов:ЗначениеОписаниеstaticЗадает статический метод.
Подробнее объяснения см. в спецификаторе static для свойств.abstractАбстрактные методы просто объявляются, но не реализуются в данном классе. Тело методадолжно быть описано в подклассах текущего класса. Ни static-методы, ни конструкторыклассов не могут объявляться как abstract. Более того, абстрактные методы нельзя определятькак final, поскольку в этом случае их нельзя будет переопределить.finalЛюбые подклассы текущего класса не смогут переопределить данный метод (о переопределении методов см.
ниже). Эта возможность увеличивает защищенность ваших классов игарантирует, что операции, определенные в данном методе, никак нельзя будет изменить.nativeМетоды, написанные не на языке Java, а на других языках программирования. Обычно такиеметоды пишутся на C++ для ускорения работы критических участков программы. Дляопределения этих методов нужно поместить спецификатор native в начале объявления методаи вместо тела метода поставить точку с запятой.
Пример: native void toggleStatus();synchronized Позволяет защитить данные, которые могут быть разрушены в том случае, если два метода,из разных потоков, пытаются одновременно обратиться к одним и тем же данным. Syncronized-метод не может начать работать со свойствами, пока их не освободит другой метод.Методы доступа в классах.Свойства класса можно создавать, описывая на уровне класса, public - переменные. Однако, болееоптимальное решение – это описать на уровне модуля 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. Создание иерархии объектов.Необходимо отличать наследование, от создания иерархии объектов. Принаследовании, порожденный класс получает набор свойств и методов откласса, от которого происходит наследование.