Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования JAVA.pdf
Скачиваний:
373
Добавлен:
02.05.2014
Размер:
2.57 Mб
Скачать

converted to PDF by BoJIoc

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

При завершении работы приложения вызываются методы finalize для всех существующих объектов. Это происходит независимо от того, что послужило причиной завершения; тем не менее некоторые системные ошибки могут привести к тому, что часть методов finalize не будет запущена. Например, если программа завершается по причине нехватки памяти,

то сборщику мусора может не хватить памяти для поиска всех объектов и вызова их методов finalize. И все же в общем случае можно рассчитывать на то, что метод finalize будет вызван для каждого объекта.

2.10.2. Восстановление объектов в методе

Метод finalize может воскреситьобъект, снова делая его используемым скажем, включая его в статический список объектов. Подобные действия не рекомендуются, но Java не сможет ничего сделать, чтобы предотвратить их.

Тем не менее Java вызывает finalize ровно один раз для каждого объекта, даже если данный объект уничтожается сборщиком мусора повторно из-за того, что он был восстановлен в предыдущем вызове finalize. Если подобное восстановление объектов оказывается важным для концепции вашей программы, то происходить оно будет всего один раз маловероятно, чтобы вы добивались от программы именно такого поведения.

Если вы действительно считаете, что вам необходимо восстанавливать объекты, попробуйте тщательно пересмотреть свою программу возможно, вы обнаружите в ней какие-то недочеты. Если же и после этого вы уверены, что без восстановления объектов никак не обойтись, то правильным решением будет дублирование или создание нового объекта, а не восстановление. Метод finalize может создать ссылку на новый объект, состояние которого совпадает с состоянием уничтожаемого объекта. Так как дублированный объект создается заново, при необходимости в будущем может быть вызван его метод finalize, который поместит еще одну копию объекта в какой-нибудь другой список это обеспечит выживание если не самого объекта, то его точной копии.

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

converted to PDF by BoJIoc

В этой команде 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.