Facebook google+ e-mail
Учимся программировать на JAVA
Практикум по программированию на языке Java

Занятие 5. Начинаем вникать (окончание)

Это второе из теоретических занятий. Оно будет посвящено только одному, но очень важному вопросу – порождению (вместо порождения чаще говорят о создании) экземпляров (или объектов) класса.

Для этого чуточку изменим нашу первую программу. Откройте FAR, перейдите в каталог JavaLessons, найдите файл MoneyForNothig.java и нажмите клавишу F4. Файл откроется в режиме редактирования. Измените файл следующим образом:

1. public class MoneyForNothing {

2.     // Конструктор

3.     public MoneyForNothing () {

4.         System.out.println ("Java programming is cool!!!");

5.     }

6.     public static void main (String [] args) {

7.         MoneyForNothing mfn = new MoneyForNothing ();

8.     }

9. }

Вот этот же файл в редакторе FAR-а:

Программируем на Java. Первые шаги. Вникаем

Откомпилируйте файл (javac MoneyForNothig.java), убедитесь, что нет ошибок и запустите на исполнение (java MoneyForNothing). Видно, что новый вариант программы работает в точности так же, как и старый. Зачем же было усложнять программу?

Вы видите, что изменилось содержимое точки входа (т.е. метода main)? Здесь мы впервые встречаемся с ключевым словом new (оно дословно переводится как «новый», а фактически означает «создать»). Эта конструкция создает экземпляр класса (объект) MoneyForNothing (стр.7). Обратите внимание, что после new следует имя самого класса, т.е. MoneyForNothing со скобками, в которых, как вы должно быть помните, могут передаваться параметры. В нашем случае никаких параметров не передается, но в общем случае это не так (примеры нам еще встретятся). Конструкция new MoneyForNothing () очень напоминает вызов метода с именем MoneyForNothing, но – внимание! – это не метод, а конструктор.

В чем назначение конструктора? Фактически, конструктор, это специальный программный код для создания экземпляра класса. Синтаксически конструктор оформляется так же как и метод, но он не имеет возвращаемого значения (даже void); это и понятно, т.к. задача конструктора не столько в том, чтобы манипулировать состоянием объекта, сколько в том, чтобы подготовить объект к работе; он создает в памяти компьютера объект и инициализирует (устанавливает) его в некоторое исходное состояние.

А где же в нашем исходном коде сам конструктор? Да вот же он:

...

2.     // Конструктор

3.     public MoneyForNothing () {

4.         System.out.println ("Java programming is cool!!!");

5.     }

...

Кстати, обратите заодно внимание как в Java оформляются однострочные комментарии: комментарий - это последовательность символов «//» за которой (вплоть до конца текущей строки) следует произвольный текст. Назначение комментариев – пояснения к программам и вообще – любые заметки; комментарии предназначены исключительно для удобства программистов и не оказывают никакого влияния на генерируемый код и логику программы. Кроме однострочных, в Java есть еще два вида комментариев – многострочные и комментарии для документирования, но сейчас мы не будем отвлекаться.

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

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

...

MoneyForNothing mfn = new MoneyForNothing ();

             1          2                  3

...

Что здесь происходит? А вот что:

1. мы объявляем о том, что намерены создать экземпляр (объект) класса MoneyForNothing (точка 1);

2. этот экземпляр получит свое собственное имя, а именно mfn (точка 2). Вы вправе придумать любое другое имя; главное, чтобы это имя не совпадало ни с одним из ключевых слов – таких, как class или void, не было ранее использовано в этом же классе, начиналось обязательно с буквы и не содержало никаких других символов помимо букв и цифр. Регистр, как обычно, имеет значение (т.е. mfn и mFn – разные имена);

3. объявленный экземпляр (с именем mfn) класса имеет тип MoneyForNothing (точка 3). О том, что такое тип мы поговорим чуть ниже.

4. при выполнении программы JVM выделит достаточный объем памяти (об этом вам заботиться не нужно), разместит в нем нем все необходимые структуры и инициализирует класс (подготовит к исполнению).

5. после этого мы можем ссылаться на экземпляр класса по его имени, т.е. по mfn. Теперь экземпляр класса реально существует и может выполнять какую-то работу.

Конечно, наше описание не строгое и некоторые детали мы опустили; за подробностями следует обратиться либо на сайт Java, либо к документации. Но нам пока достаточно и того, что сказано.

Выше мы упомянули о том, что экземпляр класса имеет некоторый тип. Что такое тип? Коротко говоря, тип – это нечто, обладающее состоянием и поведением. Непонятно? Будем разбираться...

Начнем издалека; вспомним, что практически ежедневно мы пользуемся числами. Скажем, для того, чтобы пересчитать число людей в комнате, мы используем обычные натуральные (т.е. целые неотрицательные) числа 0, 1, 2, ... Если их дополнить отрицательными, то получится тип данных, который называется просто – целые числа; такой тип данных имеется в Java. Над целыми числами определены стандартные арифметические операции: сложение, умножение, вычитание и деление (понятно, кроме деления на 0). Однако, применяя арифметические операции с этим типом данных, надо быть осторожным. Скажем, 8/2 дает в результате 4 и это правильно. Но что получится если попытаться выполнить деление 8/5? Кажется, что результат равен 1.6, но это неправильно! Почему? Да потому, что 1.6 – уже не целое число, поэтому дробная часть будет отброшена (именно отброшена, а не округлена до 2) и результат будет равен 1. Не верите? Вот простейшая программа, которая это доказывает:

public class Test {

    public static void main (String [] args) {

        System.out.println (8/5);

    }

}

Если вам нужна точность, то хотя бы одно из чисел должно быть представлено, с дробной частью (например, 8.0). Тип – это нечто обладающее определенным набором значений и определенным поведением. В случае целых чисел набор значений это, очевидно, ..., -3, -2, -1, 0, 1, 2, 3, ... А поведение – это набор допустимых операций и их результатов. В случае целых чисел результатом операции деления 8/5 будет 1.

Экземпляр (объект) класса – это тоже тип, разве что не такой привычный, как числа или строки. У него есть значение (это значение определяется состоянием его полей, а также другой информацией). Поведение класса определяется методами которые в нем определены. Мы намеренно не приводим точных и строгих определений, поскольку это завело бы нас в такие «дебри», которые сейчас будут только мешать. Лучше рассмотреть небольшую модификацию нашего класса:

public class MoneyForNothing {

    String str = "";

 

    // Конструктор

    public MoneyForNothing () {

        str = "Java programming is cool!!!";

        printMessage (str);

    }

 

    // Печать сообщения

    void printMessage (String msg) {

        System.out.println (msg);

    }

 

    public static void main (String [] args) {

        MoneyForNothing mfn = new MoneyForNothing ();

    }

}

Эта программа (уже в который раз) делает то же самое, что и ее первые две версии. Но сама программа устроена иначе. Прежде всего, мы вводим переменную str (во многих случаях поле и переменная это одно и то же) и объявляем, что эта переменная имеет тип String (т.е. может принимать любые значения, представляемые как строки). Запомните: все переменные, вне зависимости от их типа, должны быть явно объявлены. Переменная str изначально содержит пустую строку (на это указывает пара двойных кавычек внутри которых ничего нет).

В конструкторе класса переменная str принимает новое значение. Затем производится вызов метода printMessage, которому в качестве параметра передается переменная str.

Сам метод printMessage находится вне конструктора. Следует отличать вызов метода (он – в конструкторе), от самого метода (он – где-то в другом месте внутри класса). Метод имеет параметр строкового типа, что согласуется с его вызовом в теле конструктора. Этот параметр просто распечатывается на консоли. Сам метод никаких данных не возвращает (обратите внимание на void).

На этом наше занятие завершено. Обязательно продумайте все, что мы только что обсудили. Изменяйте программу, экспериментрируйте. Только так приходит понимание, навык и уверенность.

Следующее занятие уже будет не таким «скучным» как это и предыдущее: мы попробуем сформировать и вывести на экран настоящее графическое окно. В Java это сделать очень просто.

 

Занятие 4. Начинаем вникать (начало)

 

Занятие 6. Графические интерфейсы: первое окно

 

Автор: Alex Tuesday

 

Все уроки ... 03.02.2014