Кен Арнольд Джеймс Гослинг

Вид материалаДокументы

Содержание


2.11. Метод main
2.12. Метод toString
2.13. Родные методы
Глава 3РАСШИРЕНИЕ КЛАССОВ
Подобный материал:
1   ...   11   12   13   14   15   16   17   18   ...   81

2.11. Метод main


Детали запуска Java-приложений могут отличаться для разных систем, но всегда необходимо указать имя класса, который управляет работой приложения. При запуске программы на Java система находит и запускает метод main этого класса. Метод main должен быть объявлен как public, static и void (то есть не возвращающий никакого значения), и ему должен передаваться один аргумент типа String[]. Приведем пример метода main, выводящего значения своих параметров:

class Echo {

public static void main(String[] args) {

for (int i = 0; i < args.length; i++)

System.out.print(args[i] = “ ”);

System.out.println();

}

}


В массиве строк содержатся “аргументы программы”. Чаще всего они вводятся пользователем при запуске приложения. Например, в системе с использованием командной строки — такой, как UNIX или DOS Shell, — приложение Echo может быть вызвано следующим образом:

java Echo in here

В этой команде java является интерпретатором байт-кода Java, Echo — имя класса, а остальные параметры представляют собой аргументы программы. Команда java находит откомпилированный байт-код класса Echo, загружает его в виртуальную машину и вызывает метод Echo.main с аргументами, содержащимися в элементах массива String. Результат работы программы будет следующим:

in here

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

Приложение может содержать несколько методов main, поскольку каждый из его классов может иметь такой метод. Тем не менее в каждой программе используется всего один метод main, указываемый при запуске, — в приведенном выше примере это был метод класса Echo. Присутствие нескольких методов main имеет положительный эффект — каждый класс может иметь метод main, предназначенный для проверки его собственного кода, что дает превосходную возможность для модульного тестирования класса. Мы рекомендуем пользоваться подобной техникой в ваших программах. /Метод main присутствует во многих примерах, приведенных в этой книге. Ограниченный объем не позволяет нам приводить метод main для каждого примера, но обычно мы используем этот метод при разработке собственных классов для нетривиальных приложений и библиотек./

Упражнение 2.14

Измените метод Vehicle.main так, чтобы он создавал объекты-машины для владельцев, чьи имена указаны в командной строке, и выводил информацию о новых объектах.

2.12. Метод toString


Если объект включает общедоступный (public) метод toString, который не получает параметров и возвращает объект String, то данный метод вызывается каждый раз, когда объект этого типа встречается вместо строки в операторе + или +=. Например, следующий фрагмент выводит содержимое массива небесных тел:

static void displayBodies(Body[] bodies) {

for (int i = 0; i < bodies.length; i++)

System.out.println(i + “: ” + bodies[i]);

}


Если повнимательнее присмотреться к вызову println, можно обнаружить два неявных приведения к строковым значениям: первое — для индекса i и второе — для объекта Body. Значения всех примитивных типов неявно преобразуются в объекты String при использовании в подобных выражениях.

В Java не существует универсального механизма для преобразования значения типа String в объект. Разумеется, вы можете включить в класс свою собственную функцию для подобного приведения. Обычно для этого используется некий аналог метода fromString, изменяющий текущее состояние объекта, либо конструктор, принимающий параметр типа String, который определяет исходное состояние объекта.

Упражнение 2.15

Включите в класс Vehicle метод toString.

Упражнение 2.16

Включите в класс LinkedList метод toString.

2.13. Родные методы


Если вам потребовалось написать на Java программу, в которой должен использоваться код, написанный на другом языке программирования, или если вам приходится напрямую работать с какой-либо аппаратурой, можно прибегнуть к помощи родных (native) методов. Родной метод может вызываться из программы на Java, но пишется он на “родном” языке — обычно на C или C++.

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

Сведения, касающиеся написания родных методов, приведены в Приложении A.

Глава 3
РАСШИРЕНИЕ КЛАССОВ


Вы поймете меня, если я скажу, что могу проследить свою родословную вплоть до частиц первичной протоплазмы.
Гильберт и Салливан, The Mikado

Во время экскурсии мы кратко познакомились с тем, как происходит расширение, или субклассирование, благодаря которому расширенный класс может использоваться вместо исходного. Такая возможность носит название полиморфизма — это означает, что объект данного класса может выступать в нескольких видах, либо самостоятельно, либо в качестве объекта расширяемого им суперкласса. Класс по отношению к расширяемому им классу называется подклассом, или расширенным классом; расширяемый класс, в свою очередь, называется суперклассом.

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